Node JS 如何检测字符串编码

5

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

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

输入:¨Quin ha enga¤ado

输出:¿Quién ha engañado

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

1个回答

5
在[Node]JS中,没有CP437编码的字符串。字符串始终是Unicode(UTF-16代码单元)。
在¨Quin ha enga¤ado中,您拥有的是一个已解码的字符串,该字符串曾经以某个错误的编码转换为字节(即乱码)。您需要找到该字符串来自何处,并更改用于将其从字节转换的编码。
有时可以通过使用与错误解码相同的编码将其重新编码回缓冲区,然后这一次使用正确的编码进行解码来恢复解码不良的字符串。但是,仅当所有使用的字节恰好具有错误使用代码页中的映射,并且字符串没有进一步损坏时,才会起作用。
看起来您有一个已使用ISO-8859-1解码的字符串,因此原则上您可以将其编码为ISO-8859-1(例如new Buffer(s, 'binary')),然后将缓冲区解码为cp437(不幸的是,此编码在Node中不可用,因此您需要第三方模块,如iconv-lite)。
但是,您的字符串已经进一步损坏,因为é已完全消失。这可能是因为该字节的错误解码字符是不可见控制字符,StackOverflow不允许发布,也可能是因为该控制字符在上层链路中丢失了。如果是这样,您根本无法恢复原始字符串。
“我希望能够动态检测编码类型”
没有通用的方法可以自动检测缓冲区的编码,只有模糊的启发式方法(请参见chardet模块的实现)。如果出现乱码,则会更加困难,因为您必须猜测真实编码和错误应用的编码。
您可以花费大量时间尝试检测常见模式,但最终您永远无法获得可靠的解决方案。毕竟,¨Quin ha enga¤ado已经是一个完全有效的字符序列,您的代码如何知道那不是原本意思?
更好的解决方法是在更高层次上修复bug,即错误解码实际发生的地方。

感谢您的建议。这些信息实际上是从网络爬取的,由于所有信息都来自公开网站,因此无法控制来源信息。 - alpha_cod
当你在进行爬取时,你需要在下载页面的时候确定/猜测编码方式。如果你使用的是request,可以参考这个问题中的一些示例。 - bobince
如果您知道文档的语言,您可以将一组编码转换为相同的列表(A->A,A->B,A->C等),然后检查结果文本中是否有任何不属于文档语言允许字符范围内的其他字符。 - Stas Arshanski
你知道如何检测Buffer实例是否以CP437编码吗?我可以使用iconv对其进行解码,但首先需要检测它是否为CP437。我已经检查了两个第三方库,其中一个检测到文件是ASCII格式,另一个则检测到它是UTF16格式,但都不确定,因为它们检测到了5种不同的编码格式,但没有一种是CP437。在PHP中有函数可以检测编码。 - jcubic

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