Sta*_*tec 0 javascript unicode json utf-8
根据这个问题, JSON是使用代理对自动编写的.
但是,这不是我的经验.
使用Node 6.9.2
和以下代码,我的文件仍显示未使用代理项对编码的字符.
const fs = require('fs')
const infile = fs.readFile('raw.json', 'utf8', (err, data) => {
if (err) {
throw err
}
data = JSON.stringify(data)
fs.writeFile('final.json', data, 'utf8', (err) => {
if (err) {
throw err
}
console.log('done')
})
})
Run Code Online (Sandbox Code Playgroud)
在我的编辑器中,它必须具有良好的unicode和使用以及具有这些字符的字形的字体,该文件的内容raw.json
具有诸如"?"
该角色仍然出现final.json
(没有变化).
此外,我试过编码切换utf8
到utf16le
了正在写入的文件,但没有任何改变.
有没有办法强制使用代理对?
如果得出的结论是JSON.stringify
将基本多语言平面之外的字符串中的Unicode字符转换为一系列\u
转义代理对值,则引用的问题会产生误导.这个答案更好地解释了如何JSON.stringify
只需要转义反斜杠(\
),双引号("
)和控制字符.
因此,如果输入数据包含占用多个八位字节的字符(例如,例如"'''),它将作为该字符写入输出文件.如果文件成功写入然后使用UTF16编码回读,则希望UTF8编码的输入字符是您看到的字符.
如果目标是使用\u
非ASCII值的转义字符将JSON文本转换为ASCII,以及BMP之外的字符的代理对,则可以使用简单的字符检查处理JSON格式的字符串(JSON已经转换了引号,反斜杠和控件特点:
var jsonComponent = '"2®???"'; // for example
function jsonToAscii( jsonText) {
var s = "";
for( var i = 0; i < jsonText.length; ++i) {
var c = jsonText[ i];
if( c >= '\x7F') {
c = c.charCodeAt(0).toString(16);
switch( c.length) {
case 2: c = "\\u00" + c; break;
case 3: c = "\\u0" + c; break;
default: c = "\\u" + c; break;
}
}
s += c;
}
return s;
}
console.log( jsonToAscii( jsonComponent));
Run Code Online (Sandbox Code Playgroud)
这利用了JavaScript字符串已经在UTF16中的事实(因此包含代理项对),但是通过数组符号查找和.charAt
方法作为连续的UCS-2 16位值进行访问.请注意,'题'不在BMP之外,只需要UTF16中的两个八位字节,而表情符号在平面0之外,需要4个八位字节(UTF16).
如果这不是目标,那么至少有一个小问题没有问题.
归档时间: |
|
查看次数: |
117 次 |
最近记录: |