我想知道是否有办法通过字节范围来检测mojibake (无效)字符。(举个简单的例子,检测有效的ascii字符只是看看它们的字节值是否小于128)考虑到旧的自定义字符集,比如JIS,EUC,当然还有UNICODE,有什么方法可以做到这一点吗?
直接的兴趣是在C#项目中,但我希望找到一个尽可能独立于语言/平台的解决方案,这样我就可以在c++、Java、PHP语言或其他语言中使用。
Arrigato
发布于 2011-07-01 00:27:04
通过字节范围检测文字化け(mojibake)是非常困难的。
如您所知,大多数日语字符都是由多字节组成的。在Shift-JIS (日本最流行的编码之一)的情况下,日语字符的第一个字节的范围是0x81到0x9f和0xe0到0xef,第二个字节的范围是其他的。此外,可以在Shift-JIS文字中插入ASCII字符。这很难。
在Java中,您可以使用java.nio.charset.CharsetDecoder检测无效字符。
发布于 2011-07-08 23:40:57
您在这里尝试做的是由Web浏览器执行的字符编码自动检测。因此,您可以使用现有的字符编码检测库,如universalchardet library in Mozilla;将其移植到您选择的平台应该很简单。
例如,使用Mark Pilgrim的Python 3 port of the universalchardet library
>>> chardet.detect(bytes.fromhex('83828357836f8350'))
{'confidence': 0.99, 'encoding': 'SHIFT_JIS'}
>>> chardet.detect(bytes.fromhex('e383a2e382b8e38390e382b1'))
{'confidence': 0.938125, 'encoding': 'utf-8'}但它并不是100%可靠的!
>>> chardet.detect(bytes.fromhex('916d6f6a6962616b6592'))
{'confidence': 0.6031748712523237, 'encoding': 'ISO-8859-2'}(给读者的练习:这到底是什么编码?)
发布于 2021-03-17 00:49:06
这不是对这个问题的直接回答,但我有幸使用了ftfy Python包来自动检测/修复mojibake:
>>> import ftfy
>>> print(ftfy.fix_encoding("(ง'⌣')ง"))
(ง'⌣')ง就我的目的而言,它运行得出奇地好。
https://stackoverflow.com/questions/6536859
复制相似问题