日本乱码检测

5
我想知道是否有一种方法可以通过字节范围检测乱码字符(无效字符)。(例如,检测有效的ASCII字符只需查看它们的字节值是否小于128)考虑到旧的自定义字符集,如JIS、EUC和当然,UNICODE,是否有一种方法来解决这个问题?
立即感兴趣的是在一个C#项目中,但我希望尽可能找到一种语言/平台独立的解决方案,这样我就可以在C++、Java、PHP或其他任何语言中使用。
谢谢。

你把“arigatou”拼错了 :) - MGZero
是的,但它总是取决于您使用的罗马化系统 - 就像您对长元音使用“u”一样。 - Michael
我很好奇,因为我不太理解这个问题:这是关于抽象的Unicode代码点序列的问题,还是关于特定编码的问题,还是关于音译的问题? - Kerrek SB
@kef Schector - 不想偏离主题...据我所知,“yoroshiku onegaishimasu”是说“谢谢”的正式方式(也是默认方式),但在非正式场合,“arigato”非常普遍。 - James John McGuire 'Jahmic'
"Arigatou"(不会拼成“arrigato”)用于感谢某人已经完成的事情。"Yoroshiku onegaishimasu"用于提前感谢他们的某事。如果您想更不正式,可以只说"onegaishimasu"。 - Kef Schecter
显示剩余4条评论
4个回答

1

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

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

在 Java 中,您可以使用 java.nio.charset.CharsetDecoder 检测无效字符。


我认为你说得对,至少是很困难的。事实上,如果没有参考指示器,有些情况下你无法确定字节流是否为Unicode编码。但是,我仍然会将这个问题保持开放状态一段时间,以查看其他回复可能会出现什么。 - James John McGuire 'Jahmic'

0

你在这里尝试做的是像Web浏览器一样进行字符编码自动检测。因此,你可以使用现有的字符编码检测库,比如Mozilla中的universalchardet;将其移植到你选择的平台应该很简单。

例如,使用Mark Pilgrim的Python 3版本的universalchardet

>>> 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'}

(读者练习:这实际上是什么编码?)

0

-1

我暂时没有时间和/或优先级来跟进这个问题,但我认为,如果知道源是Unicode,使用这些图表并跟随一些这里已经完成的工作,我认为可以在这个问题上取得一些进展。同样,对于Shift-JIS,使用这个图表也会有所帮助。


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