Не подходит кодировка файла при записи файла с помощью API Chrome File System
Я пытаюсь написать файл, используя TextEncoder
а также TextDecoder
, Мне также нужно сложить 65 в таблицу ASCII и не суммировать, когда я имею дело с разрывом строки. Я адаптировал предложенное здесь решение для чтения файла с файловым API. Однако я сталкиваюсь с некоторыми проблемами при работе с кодировкой.
// write cames from fileEntry.createWriter
var result='0'+String.fromCharCode(124)+'1234'+String.fromCharCode(10); // 0|1234
var asciiArray=[];
var stringArray=[];
var fileContent='';
var tpmBuffer;
var uint8array=new TextEncoder().encode(result); // returns a Uint8Array containing the text given in parameters encoded
uint8array=uint8array.map((byte)=>byte+65); // shift :)
for(var i=0;i<uint8array.length;i++) {
if(uint8array[i]!==75) {
asciiArray.push(uint8array[i]);
} else {
// I cant shift line break!
asciiArray.push(10);
tpmBuffer= new TextEncoder().encode(String.fromCharCode.apply(null,asciiArray));
stringArray.push(new TextDecoder("utf-8").decode(tpmBuffer));
console.log(stringArray); //["q½rstu\n"]
asciiArray=[];
}
}
var encodedBlob= new Blob(stringArray, {
encoding:'UTF-8',
type: 'text/plain;charset=UTF-8'
});
// writer.write(encodedBlob);
Когда я пытаюсь прочитать сгенерированный контент, я получаю следующее:
// Now we read the generated file content with:
// fileContent = "q½rstu\n"
var buf= new Uint8Array(fileContent);
buf=buf.map((byte)=>byte-65);
var fileAsString= new TextDecoder("ascii").decode(buf);
/*
output bellow is given by console.log(fileAsString[i], fileAsString.charCodeAt(i));
0 48
129 -> Why this guy appers?
| 124
1 49
2 50
3 51
4 52
*/
Почему это 129
элемент появляется, когда я читаю fileContent, если он не появляется, когда я строю строку?
1 ответ
Тот 129
элемент приходит из buf.map((byte)=>byte-65)
,
Если я могу понять эту запись, она вычитает число 65
от каждого байта в buf
,
Это может хорошо работать для // fileContent = "qrstu\n"
но не будет работать, как ожидалось, если fileContent
содержит символы не ASCII (более 7 бит), например, для // fileContent = "q½rstu\n"
так как ½
Вульгарная фракция одна половина, кодовая точка U+00BD
, UTF-8 кодируется как последовательность байтов 0xC2
, 0xBD
,
И элементарно cmd
арифметика set /a 0xc2 - 65
дает результат 129
,
Кстати, я думаю, что buf.map((byte)=>byte-65)
может вызвать ошибку, если значение ASCII символа в fileContent
меньше чем 65
если предположить, что byte
тип данных со значением без знака