如何在Node JS中检测字符串编码并将字符串转换为有效的Unicode字符串。 例如,我如何检测CP437编码的字符串并将其转换为有效的Unicode字符串。 输入:¨Quin ha enga¤ado 输出:¿Quién ha engañado 我希望动态检测编码类型并将字符串转换为有效的Unicode字符串。提前致谢。
在[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,即错误解码实际发生的地方。
request
,可以参考这个问题中的一些示例。 - bobince