免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6390 | 回复: 15
打印 上一主题 下一主题

[C] 关于windows-1251字符集检测和转码utf-8的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-22 17:42 |只看该作者 |倒序浏览
本帖最后由 yuleyouxi 于 2013-05-22 17:44 编辑

android手机,客户要求音乐的专辑歌手等信息支持俄罗斯一种本地编码windows-1251
就是和这个帖子是一样的需求:http://bbs.chinaunix.net/thread-3777433-1-1.html(避免挖坟,另开一贴吧)

@mci2004,当时你是怎么解决这个问题的,请指点下,非常感谢!
本来想发短消息的,奈何还没这权限。。。

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
10 [报告]
发表于 2013-05-25 22:53 |只看该作者
lz 我给你发私信了,收到了吗?  

私信的原因倒不是保密,而是我觉得我的方法很sb,不好意思拿出来说。

现在,转而一想,应该发出来的,让大家指点下,或者欢乐下...

当时做法非常的SB,以至于到现在都BS自己。
我来说下吧。

1,mp3的歌曲信息从ID3 tag开始,android上相应的问题是 ID3.cpp。所以加字符编码的支持从这里开始改。

2,android上自带了一个 icu4c的库,这个库是IBM做的专门用来做字符转码的。所以我们的转码就要用它了。

3,如何判断一个mp3文件是否是 1251呢?这里,就是我觉得非常SB的地方了,判断方法如下:
     
      如果发现当前所处的locale是 russian等地(用cryrillic字符集的地区),就把所有的单字节字符当1251转成utf8,就用前面提到的icu4c的库。


这样的转的话,对 latin1语系的字符就毁了,但是对于中,日,韩等文字可以幸免!

论坛徽章:
0
11 [报告]
发表于 2013-05-27 16:05 |只看该作者
mci2004 发表于 2013-05-25 22:53
lz 我给你发私信了,收到了吗?  

私信的原因倒不是保密,而是我觉得我的方法很sb,不好意思拿出来说。
...
我前两天再看了下,我在想能不能像处理GBK一样处理呢?windows-1251也是有一个范围的,是不是可以根据这个来判断是不是这个字符集 然后再来转换呢?

论坛徽章:
0
12 [报告]
发表于 2013-05-28 10:52 |只看该作者
mci2004 发表于 2013-05-25 22:53
lz 我给你发私信了,收到了吗?  

私信的原因倒不是保密,而是我觉得我的方法很sb,不好意思拿出来说。
...
ISO 8859各个体系都是只用00-FF表示,貌似也只能用local来判断了,要不谁知道是用的ISO8859-1还是ISO8859-5啊。。。另外,再ID3.cpp中看到用0x00  0x02 0x03分别表示ISO8858-1 UTF-16 UTF-8,那是不是还有别的数字表示别的语言呢?可惜网上没找到这块资料说明这个数字有哪些选择。。。

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
13 [报告]
发表于 2013-05-28 14:56 |只看该作者
回复 12# yuleyouxi


没有办法判断出俄语,原因很简单,俄语是单字节的,和中,日,韩的语言文字不一样,他们都是双字节表示。

确定中,日,韩这些字符集的方法也很简单,就是去查一张表,然后根据命中情况得出一个 confidence,然后就认为当前的文字和confidence最大者一致。


如果想判断出俄语,可以用上面类似的方法,但是单字节的字符集,文字太少了,而且前面的128个字符和ascii保持一致,比如我想“猜”这个字符串(包含5个字符)是 latin1 还是1251。很可能这5个字符的表示方式即出现在latin1中又出现在1251中。所以,没法区分开。(我试过,效果很差)

lz,可以出查一下这两种(latin1 和1251)的code page,你就明白了....



lz,我说明白了吗?也许是我的方法有问题,你可以想个更好的,到时候跟我分享下哈。。。。

论坛徽章:
0
14 [报告]
发表于 2013-05-29 18:15 |只看该作者
mci2004 发表于 2013-05-28 14:56
回复 12# yuleyouxi
嗯  后来我看了下ISO 8859 貌似只能根据local来判断了,android原始代码貌似就是只管Latin-1,其他的忽略掉了,我想的办法也只有根据local来,其他系列的不管了

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
15 [报告]
发表于 2013-05-30 11:23 |只看该作者
回复 14# yuleyouxi


    再补充一下,目前的编辑软件(如 vim)也好,或者是OS上对字符集的处理都是把不认识的字符当成latin1,所以,我们有时候看到的“乱码”其实就是一堆latin1罢了!


   为什么转latin1呢?因为latin1覆盖的国家最多?

论坛徽章:
0
2 [报告]
发表于 2013-05-22 17:47 |只看该作者
怎么@不成功啊。。
再试一次  @mci2004

论坛徽章:
0
3 [报告]
发表于 2013-05-22 17:52 |只看该作者
哪位大神了解的?     或者帮忙@mci2004,谢谢!
@mci2004  还不成功么?

论坛徽章:
0
4 [报告]
发表于 2013-05-23 15:08 |只看该作者
没有大神指点下么?
@mci2004

论坛徽章:
0
5 [报告]
发表于 2013-05-23 15:17 |只看该作者
没招了,传送不成功啊。。。
CU咋这么冷清,人呢?
@mci2004
@yuleyouxi

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2013-05-23 15:30 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2013-05-23 15:43 |只看该作者
hellioncu 发表于 2013-05-23 15:30
@mci2004
谢谢!请问下我怎么召唤不成功呢?
难道这个也需要权限?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2013-05-23 15:49 |只看该作者
yuleyouxi 发表于 2013-05-23 15:43
谢谢!请问下我怎么召唤不成功呢?
难道这个也需要权限?


应该不用,输入框左上角有 @ ,点这个就知道了

论坛徽章:
0
9 [报告]
发表于 2013-05-24 10:37 |只看该作者
hellioncu 发表于 2013-05-23 15:49
应该不用,输入框左上角有 @ ,点这个就知道了
那看样子貌似是需要权限的,我没看到左上角有@符号。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP