Kotlin/Android 检测文本编码

Recently doing Android 版本的落格输入法在导入码表的时候我犯了难因为落格输入法的码表是支持 utf8 和 gb18030 两种编码格式的甚至我自己内置的码表也是混用这两种格式的在 Swift 或者 Python 中如果你使用错误的编码去解码文本就会收到报错利用这个办法我可以轻松实现两种编码的检测——先用 utf8 解码报错了就再试试 gb18030. easy and convenient,足够我用

可是这个情况在 Kotlin 中不灵了!在 Java 中如果你使用错误编码解码文本它只会给你一坨乱码!这在其他语言中通常都需要明确强制解码才能实现……但在 Java 中是默认的而且没有办法让它报错

it's hard to do,After query,我找到了一个号称能检测各种编码的第三方库https://github.com/albfernandez/juniversalchardet But unfortunately,它并不能成功检测 gb18030.

 

At last,中文的问题果然还得用中文来搜索http://www.meilongkui.com/archives/473 我找到了这么一篇文章据说文中的调用方法是可以触发报错的我按文中的方案先读取一小段内容然后进行转换…………成功了!但也有个小问题由于读取的buffer长度是截断的所以有可能导致即使是 utf8 的文本也不能成功用 utf8 解出来因为你可能恰好 buffer 到了一个字符编码的中间

Final,我的解决方案是一次性读取全部内容这样就不会出错啦

Of course,代价就是需要一次性将所有内容读进内存对我来说问题不大因为输入法码表通常并不是很大。if necessary,其实也可以对 buffer 的大小或者位置进行一点偏移然后再试一次之类的

Final,Code like this:

 

Original article written by LogStudio:R0uter's Blog » Kotlin/Android 检测文本编码

Reproduced Please keep the source and description link:https://www.logcg.com/archives/3868.html

About the Author

R0uter

The non-declaration,I have written articles are original,Reproduced, please indicate the link on this page and my name。

Leave a Reply

Your email address will not be published. Required fields are marked *