Node JS 检测字符串编码

alp*_*cod 5 unicode utf-8 node.js

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

\n\n

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

\n\n

输入:\xc2\xa8Quin ha enga\xc2\xa4ado

\n\n

输出:\xc2\xbfQui\xc3\xa9n ha enga\xc3\xb1ado

\n\n

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

\n

bob*_*nce 5

[Node]JS 中不存在 CP437 编码字符串之类的东西。字符串始终是 Unicode(也就是 UTF-16 代码单元)。

\n\n

你有什么\xc2\xa8Quin ha enga\xc2\xa4ado是在过去某个时刻使用错误的编码从字节解码的字符串(又名 mojibake)。您需要找到该字符串的来源,并更改用于将其从字节转换为的编码。

\n\n

有时可以通过使用与错误解码时相同的编码将其编码回缓冲区,然后使用正确的编码再次解码,从而挽救解码错误的字符串。但这仅在所使用的所有字节恰好在错误使用的代码页中具有映射并且不会对字符串造成进一步损坏时才有效。

\n\n

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

\n\n

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

\n\n
\n

我希望动态检测编码类型

\n
\n\n

没有通用的方法来自动检测缓冲区的编码,只有模糊的启发式方法(有关其实现,请参阅 chardet 模块)。当你有 mojibake 时,这会加倍困难,因为你必须猜测真实的编码和错误应用的编码。

\n\n

您可能会花费大量时间来尝试检测常见模式,但最终您永远不会有可靠的解决方案。毕竟,\xc2\xa8Quin ha enga\xc2\xa4ado已经是一个完全有效的字符序列了,您的代码如何知道这不是真正的意思?

\n\n

最好进一步修复错误,即错误解码实际发生的地方。

\n