有没有办法强制Node使用Unicode字符的代理对来编写文件(在JSON中)?

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(没有变化).

此外,我试过编码切换utf8utf16le了正在写入的文件,但没有任何改变.

有没有办法强制使用代理对?

tra*_*r53 5

如果得出的结论是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).

如果这不是目标,那么至少有一个小问题没有问题.