【问题标题】:Inverting UTF16 to UTF8 conversion for astral characters将星体字符的 UTF16 转换为 UTF8
【发布时间】:2020-09-18 21:52:43
【问题描述】:

我的问题很简单。从一个不在基本多语言平面中的字符开始,比如var original = "????" 或等效的

var original=`\u{1f3ae}`

Javascript 通过 UTF-16 编码将此字符串存储在内存中。不幸的是,您将字符串提供给某些数据库/应用程序(细节无关)并且它错误地将 UTF-16 字节解释为 UTF-8 字节,并且当您从数据库/应用程序中读出字符串时,它实际上给您的正是

var switchedEncoding = Buffer.from(original, 'utf16le').toString('utf8')

如果您在这种情况下登录switchedEncoding,您会得到<خ�。不好。好的,所以您尝试将其切换回来:

var switchedBack = Buffer.from(switchedEncoding,'utf8').toString('utf16le')

如果您在这种情况下登录 switchedBack,您会得到 �붿 而不是 ????。无赖。

另一方面,如果您的原始字符串在 BMP 中,switchedBack 可以很好地恢复原始字符串。我的问题是信息是否会因应用程序/数据库的错误解码而不可逆转地丢失?如果没有,我想要一个聪明的函数,即使是星光层中的角色也可以反转它。

感谢您的帮助!

【问题讨论】:

    标签: node.js encoding utf-8 utf-16 utf


    【解决方案1】:

    答案如下。我可以让数据库(一个 leveldb)将内容读入缓冲区,然后我使用节点中的 iconv 包使用以下方法:

    const Iconv = require("iconv").Iconv;
    let iconv = new Iconv("UTF-8","UTF-16LE");
    let iconv2 = new Iconv("UTF-16LE","UTF-8");
    let original = "\u{1f3ae}"
    let switched = iconv.convert(original)
    let switchedBack = iconv2.convert(switched)
    console.log(original)
    console.log(switched.toString())
    console.log(switchedBack.toString())
    
    
    // So it's the switched.toString() which is not recoverable; 
    // switched itself (a Buffer) is;
    

    很高兴知道如果缓冲区中字节的编码不是someEncodingBuffer.toString('someEncoding') 并不总是可逆的。

    【讨论】:

      猜你喜欢
      • 2012-11-04
      • 2014-02-24
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 2016-09-04
      • 2013-03-28
      • 2013-05-29
      • 2016-07-09
      相关资源
      最近更新 更多