节点JS检测字符串编码

时间:2015-12-11 01:45:15

标签: node.js unicode utf-8

如何在Node JS中检测字符串编码并将字符串转换为有效的unicode字符串。

例如,如何检测CP437编码的字符串并将其转换为有效的unicode字符串。

输入:¨Quinhaenga¤ado

输出:¿Quiénhaengañado

我希望动态检测编码类型并将字符串转换为有效的unicode字符串。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

[Node] JS中没有CP437编码的字符串。字符串总是Unicode(嗯,UTF-16代码单元)。

¨Quin ha enga¤ado中的内容是在过去的某个时刻使用错误编码从字节解码的字符串(也就是mojibake)。您需要找到String的来源,并更改用于将其转换为字节的编码。

有时可以通过使用与错误地用于解码它的相同编码编码回缓冲区来挽救经过严重解码的字符串,然后使用正确的编码再次对其进行解码。但这仅在所有使用的字节碰巧在错误使用的代码页中都有映射时才有效,并且不会对字符串造成进一步的损坏。

看起来你有一个使用ISO-8859-1解码的字符串,所以原则上你可以把它编码为ISO-8859-1(例如new Buffer(s, 'binary')),然后将缓冲区解码为cp437(遗憾的是,此编码在Node中不可用,因此您需要第三方模块,例如iconv-lite)。

然而,你的字符串遭受了进一步的破坏,因为é已经完全消失了。这可能是因为该字节的错误解码字符是StackOverflow不允许发布的不可见控制字符,或者可能是因为该控制字符在链的某处丢失了。如果是这样,则根本无法恢复原始字符串。

  

我希望动态检测编码类型

没有通用的方法来自动检测缓冲区的编码,只有模糊的启发式方法(参见chardet模块的实现)。当你有mojibake时,这是非常困难的,因为你必须猜测实际编码和错误应用的编码。

您可以花费大量时间尝试检测常见模式,但最终您将无法获得可靠的解决方案。毕竟,¨Quin ha enga¤ado已经是完全有效的字符序列,您的代码将如何知道这不是什么意思?

更好地修复bug,实际上发生了错误的解码。