如何在nodejs中将UTF16文件转换为UTF8文件

3

我是一个有用的助手,可以为您提供翻译服务。以下是需要翻译的内容:

我有一个使用UTF16编码的XML文件,我想将其转换为UTF8以便处理。如果我使用以下命令:

iconv -f UTF-16 -t UTF-8 file.xml > converted_file.xml

文件已成功转换,我能够处理它。我希望在nodejs中也能做到相同的事情。
目前,我有一个文件缓冲区,并尝试了我所能想到和在互联网上找到的所有方法,但都没有成功。
以下是我迄今为止尝试过的一些示例:
content = new Buffer((new Buffer(content, 'ucs2')).toString('utf8'));

我也尝试过使用以下这些功能:

http://jonisalonen.com/2012/from-utf-16-to-utf-8-in-javascript/ https://dev59.com/Vm3Xa4cB1Zd3GeqPjNML#14601808

第一个功能没有改变任何内容,链接只给了我中文字符。

2个回答

5
var content = fs.readFileSync('myfile.xml', {encoding:'ucs2'});
fs.writeFileSync('myfile.xml', content, {encoding:'utf8'});

如果我不确定我的文件是否为UTF-16编码,该怎么办? - Julien Fouilhé
那是你必须限制的事情。要么验证它是否为utf16,要么找出类型。通常,您可以查询传入数据以查找类型,并插入所述类型以用于ucs2。 - Ravenous

3

虽然上面的答案是对所问问题的最佳回答。 但我希望这个答案能帮助一些需要将文件读取为二进制字符串的人:

const reader = new FileReader();
reader.readAsBinaryString(this.fileToImport);

在我的情况下,文件是utf-16编码的,我尝试将其读入XLSX:

const wb = XLSX.read(bstr, { type: "binary" });

结合上述两个链接,我首先删除了前两个字符,这些字符表示它是UTF-16(0xFFFE),然后使用此链接创建正确的数字(但我认为它实际上提供的是UTF-7编码):https://dev59.com/Vm3Xa4cB1Zd3GeqPjNML#14601808 最后,我应用第二个链接来获取正确的UTF-8数字集:https://dev59.com/Vm3Xa4cB1Zd3GeqPjNML#14601808 我最终得到的代码如下:

decodeUTF16LE(binaryStr) {
      if (binaryStr.charCodeAt(0) != 255 || binaryStr.charCodeAt(1) != 254) {
        return binaryStr;
      }
      const utf8 = [];
      for (var i = 2; i < binaryStr.length; i += 2) {
        let charcode = binaryStr.charCodeAt(i) | (binaryStr.charCodeAt(i + 1) << 8);
        if (charcode < 0x80) utf8.push(charcode);
        else if (charcode < 0x800) {
          utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));
        } else if (charcode < 0xd800 || charcode >= 0xe000) {
          utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
        }
        // surrogate pair
        else {
          i++;
          // UTF-16 encodes 0x10000-0x10FFFF by
          // subtracting 0x10000 and splitting the
          // 20 bits of 0x0-0xFFFFF into two halves
          charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (charcode & 0x3ff));
          utf8.push(
            0xf0 | (charcode >> 18),
            0x80 | ((charcode >> 12) & 0x3f),
            0x80 | ((charcode >> 6) & 0x3f),
            0x80 | (charcode & 0x3f)
          );
        }
      }
      return String.fromCharCode.apply(String, utf8);
},


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接