Unicode 日本mojibake检测

Unicode 日本mojibake检测,unicode,character-encoding,Unicode,Character Encoding,我想知道是否有办法通过字节范围检测mojibake(无效)字符。(举个简单的例子,检测有效的ascii字符只是为了看看它们的字节值是否小于128)对于旧的定制字符集,例如JIS、EUC,当然还有UNICODE,有没有办法做到这一点 P>一个C项目,但我想尽可能多地找到一个独立于语言/平台的解决方案,所以我可以用在C++、java、PHP或其他任何东西上。 Arrigato检测文字化け(mojibake)按字节范围是非常困难的 正如您所知,大多数日语字符由多个字节组成。在Shift-JIS(日本

我想知道是否有办法通过字节范围检测mojibake(无效)字符。(举个简单的例子,检测有效的ascii字符只是为了看看它们的字节值是否小于128)对于旧的定制字符集,例如JIS、EUC,当然还有UNICODE,有没有办法做到这一点

<> P>一个C项目,但我想尽可能多地找到一个独立于语言/平台的解决方案,所以我可以用在C++、java、PHP或其他任何东西上。 Arrigato

检测文字化け(mojibake)按字节范围是非常困难的

正如您所知,大多数日语字符由多个字节组成。在Shift-JIS(日本最流行的编码之一)情况下,日语字符的第一个字节范围是0x81到0x9f和0xe0到0xef,第二个字节具有其他范围。此外,可以将ASCII字符插入Shift JIS文本中。这很难


在Java中,您可以使用
Java.nio.charset.CharsetDecoder

来检测无效字符。目前我没有时间和/或优先级来跟进这一点,但我认为,如果知道源代码是Unicode,使用这些代码并完成一些工作,我认为可以在这个问题上取得一些进展。同样,对于Shift-JIS,使用它也会很有帮助。

这里尝试的是由Web浏览器执行的字符编码自动检测。因此,您可以使用现有的字符编码检测库,如;将其移植到您选择的平台应该很简单

例如,使用Mark Pilgrim's:

但它不是100%可靠

>>> chardet.detect(bytes.fromhex('916d6f6a6962616b6592'))
{'confidence': 0.6031748712523237, 'encoding': 'ISO-8859-2'}

(读者练习:这到底是什么编码?

这不是问题的直接答案,但我很幸运地使用了
ftfy
Python包来自动检测/修复mojibake:


就我而言,它的效果出人意料地好。

你把arigatou拼错了:)是的,但这总是取决于你使用的是什么罗马化系统——就像你用“u”来表示长元音一样。我用“romagi”来进一步混淆事物。好吧,完全混淆事物。我们有4个(+?)字母表(平假名(日语原版)、汉字(汉字,从中国进口)、katanana(留给现代非日语单词)、romagi(发音为英语的名称或英语拼写等效词)(一些标准化…我甚至不接近合格…),当然还有英语(europo)ascii)…无论如何。还有charecter编码,至少有六种JIS、S-JIS、EUC和一种小得多的编码。慢慢地,事情开始在Unicode上标准化,但是一旦你的数据库中有了坏数据,你怎么把它弄出来呢?我很好奇,因为我不太明白:这是一个关于Unicode抽象序列的问题吗e码点,或关于特定编码,或关于音译?我认为你是对的,至少是非常困难的。事实上,如果没有参考指示符,有些情况下你无法判断字节流是否为Unicode。但是,我仍将把这个问题留待一段时间,看看会出现哪些其他响应。
>>> chardet.detect(bytes.fromhex('916d6f6a6962616b6592'))
{'confidence': 0.6031748712523237, 'encoding': 'ISO-8859-2'}
>>> import ftfy
>>> print(ftfy.fix_encoding("(ง'⌣')ง"))
(ง'⌣')ง