最近在做android,遇到一个mp3文件中俄文字符显示乱码的问题。其实呢,对于这种蛋疼的问题完全可以无视的,但是bug是外国客户报出来的,优先级P0。我想肯定是那个制作这个mp3的人,在编辑文件信息(歌曲名字,专辑...)的时候保存成了window-1251,结果到android上媒体文件扫描的时候,不认识这个字符集然后就乱码了。我又想起序哥当年教育我,utf-8保存文件是程序员的基本常识。
我看了下android上媒体扫描这部分的代码,对于双字节编码的字符android上会做一个检测找到其对应的字符集,例如gbk,big5, shift-jis这些字符集。这个检测依据就是到一个CharSetRange的表中出二分查找这个字符,看看在不在对应的表中。
Ok,我的问题是,对于windows-1251这种单字节编码的字符,该怎么做检测呢?比如两个俄文字符例如 A B,在windows-1251上被编码成0xCFF0,但是按照android原来的检测方案0xCFF0这两个字节会被当成一个字符去那几个CharSetRange里面查表,查找失败就什么都不做直接传到上层,然后显示就是乱码,那些乱码的字符和用utf-8打开这个mp3文件看到的一样。
唉,我凌乱了,对于这种单字节编码的字符,在这个字符串传过来的时候我有办法做个检测吗?有办法知道是哪种字符集吗?我想通过查找字符范围的方法并不能确定是哪一个单字节字符集吧?因为,单字节诶我怎么知道0xCF这个字符不会出现在其他的什么XXX字符集中啊?
看看这个链接是windows-1251 to Unicode table。其实,这种字符的转换的问题,只要按照一个native code to unicode表转成对应的unicode码字传到上层就ok了,是这样吗?