diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 55a5d6387..8c2e4281a 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -15,6 +15,47 @@ export namespace ResponseResultProvider { export const JSON: ResponseResultProvider = (response) => response.json(); } +export function Utf8ArrayToStr(array: Uint8Array): string { + let out, i, c; + let char2, char3; + + out = ''; + const len = array.length; + i = 0; + while (i < len) { + c = array[i++]; + switch (c >> 4) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + // 0xxxxxxx + out += String.fromCharCode(c); + break; + case 12: + case 13: + // 110x xxxx 10xx xxxx + char2 = array[i++]; + out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f)); + break; + case 14: + // 1110 xxxx 10xx xxxx 10xx xxxx + char2 = array[i++]; + char3 = array[i++]; + out += String.fromCharCode( + ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0) + ); + break; + } + } + + return out; +} + type ResourceType = 'f' | 'd'; @injectable() @@ -275,9 +316,7 @@ export class CreateApi { // parse the secret file const secrets = ( - typeof content === 'string' - ? content - : new TextDecoder().decode(content) + typeof content === 'string' ? content : Utf8ArrayToStr(content) ) .split(/\r?\n/) .reduce((prev, curr) => { @@ -341,7 +380,7 @@ export class CreateApi { const headers = await this.headers(); let data: string = - typeof content === 'string' ? content : new TextDecoder().decode(content); + typeof content === 'string' ? content : Utf8ArrayToStr(content); data = await this.toggleSecretsInclude(posixPath, data, 'remove'); const payload = { data: btoa(data) };