日本mojibake检测

时间:2011-06-30 15:04:17

标签: unicode character-encoding

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

最直接的兴趣在于C#项目,但我想尽可能找到一个独立于语言/平台的解决方案,所以我可以使用c ++,Java,PHP等等。

Arrigato

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

您在这里尝试做的是字符编码自动检测,由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'}

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

答案 2 :(得分:0)

这不是问题的直接答案,但我很幸运地使用了 package com.example.YOUR.PACKAGE import io.flutter.app.FlutterApplication import io.flutter.plugin.common.PluginRegistry import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin class Application() : FlutterApplication(), PluginRegistry.PluginRegistrantCallback { override fun registerWith(registry: PluginRegistry?) { val key: String? = FlutterFirebaseMessagingPlugin::class.java.canonicalName if (!registry?.hasPlugin(key)!!) { FlutterFirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin")); } } } Python 包来自动检测/修复 mojibake:

 <application
        android:label="El Chaski Customer"
        android:name=".Application"
        android:icon="@mipmap/launcher_icon">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
......

它非常适合我的目的。

答案 3 :(得分:-1)

目前我没有时间和/或优先级来跟进此事,但我认为,如果知道源是Unicode,请使用这些charts并完成一些工作{ {3}},我认为可以在这个问题上取得一些进展。同样,对于Shift-JIS,使用此here可能会有所帮助。