Kotlin/Android 检测文本编码

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

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

這就很難辦了,經過查詢,我找到了一个号称能检测各种编码的第三方库https://github.com/albfernandez/juniversalchardet 但很遺憾,它并不能成功检测 GB18030.

 

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

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

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

最終,代碼是這樣的:

 

本文由 落格博客 原創撰寫:落格博客 » Kotlin/Android 检测文本编码

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3868.html

關於作者

R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

發表評論

您的電子郵件地址不會被公開. 必填字段標 *