我想知道是否有办法按字节范围检测mojibake(无效)字符。 (举一个简单的例子,检测有效的ascii字符只是为了查看它们的字节值是否小于128)鉴于旧的自定义字符集,例如JIS,EUC,当然还有UNICODE,有没有办法做到这一点?
最直接的兴趣在于C#项目,但我想尽可能找到一个独立于语言/平台的解决方案,所以我可以使用c ++,Java,PHP等等。
Arrigato
答案 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)