使用 Chrome 文件系统 API 写入文件时无法适应文件编码
Can't fit file encoding when writing a file with Chrome File System API
我正在尝试使用 TextEncoder
和 TextDecoder
编写文件。我还需要将 65 求和到 ascii table 并且在处理换行符时不求和。我已经调整了建议的解决方案 以读取文件 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 时出现,如果它在我构建字符串时没有出现?
129
元素来自 buf.map((byte)=>byte-65)
。
如果我能理解这个符号,它会从 buf
.
中的每个 byte 中减去数字 65
它可以很好地用于 // fileContent = "qrstu\n"
但如果 fileContent
包含非 ASCII 字符(超过 7 位)则无法按预期工作,例如 // fileContent = "q½rstu\n"
因为 ½
粗俗分数二分之一,代码点 U+00BD
,UTF-8 编码为字节序列 0xC2
,0xBD
。
初等cmd
算术set /a 0xc2 - 65
给出结果129
。
顺便说一句,如果 fileContent
中字符的 ASCII 值小于 65
,我认为 buf.map((byte)=>byte-65)
可能会引发错误,假设 byte
是无符号 值数据类型。
我正在尝试使用 TextEncoder
和 TextDecoder
编写文件。我还需要将 65 求和到 ascii table 并且在处理换行符时不求和。我已经调整了建议的解决方案
// 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 时出现,如果它在我构建字符串时没有出现?
129
元素来自 buf.map((byte)=>byte-65)
。
如果我能理解这个符号,它会从 buf
.
65
它可以很好地用于 // fileContent = "qrstu\n"
但如果 fileContent
包含非 ASCII 字符(超过 7 位)则无法按预期工作,例如 // fileContent = "q½rstu\n"
因为 ½
粗俗分数二分之一,代码点 U+00BD
,UTF-8 编码为字节序列 0xC2
,0xBD
。
初等cmd
算术set /a 0xc2 - 65
给出结果129
。
顺便说一句,如果 fileContent
中字符的 ASCII 值小于 65
,我认为 buf.map((byte)=>byte-65)
可能会引发错误,假设 byte
是无符号 值数据类型。