免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: colinzhengj
打印 上一主题 下一主题

[FreeBSD] wctomb bug in FreeBSD? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-02-13 13:04 |只看该作者
再请教Neil一个问题,前面的setlocale (LC_CTYPE, "en_US.UTF-8") 不是很好,我只是要UTF-8,不要求是en_US,zh_CN什么的,如果一个人机器上没en_US.UTF-8的locale info就会失败(freebsd上不太会有这种情况。很多用linux的没有en_US.UTF-8,但有zh_CN.UTF-8)

论坛徽章:
0
12 [报告]
发表于 2007-02-13 13:22 |只看该作者
这个我还真没琢磨过了
看你的意思是希望你的程序运行期间内部的数据是UTF-8编码(类似java),我现在能想到的办法是不管系统locale是什么,IN用iconv从系统locale转UTF-8,OUT用iconv从UTF-8转系统locale,这样做也许会方便些,不过效率上会差很多

没有琢磨过这个问题,抱歉。希望上面说的能对你有些帮助

btw:你可以把setlocale的第二个参数用变量来处理,在调用setlocale前先获取系统目前支持的编码,估计要做一个小的switch分支和确定一个default行为了

论坛徽章:
0
13 [报告]
发表于 2007-03-27 09:53 |只看该作者
在FreeBSD上,wctomb和mbtowc做得事情其实是很简单的,在UTF-8下mbtowc会把多字节的字符转换成unicode编码的,这是由utf-8的编码方法决定的,而zh_CN.GBK等却不是这样的,只是把高字节上的左移八位,然后和低字节的相加。mbtowc并不会转换成一个统一的编码方式。所以你通过改变locale来进行编码转换的方法应该是行不通的。至于setlocale(LC_CTYPE,"zh_CN")也是不正确的,这个函数调用的结果会失败,所以locale仍然是utf-8的。上面的setlocale最终会调用__setrunelocale("zh_CN");然后试图打开/usr/share/locale/zh_CN/LC_CTYPE,而这个文件并不存在,所以函数会失败。
在linux可以运行,好像是因为linux下的glibc中的mbtowc等会转换成一个统一的编码格式utf-8格式。没玩过linux,不太确定。

论坛徽章:
0
14 [报告]
发表于 2007-03-27 10:07 |只看该作者
Neil的方法,试过是可以的……您在哪里看到mbtowc不一定转换成固定编码?这倒和我的测试结果完全矛盾了

论坛徽章:
0
15 [报告]
发表于 2007-03-27 11:33 |只看该作者
你可以测试一下setlocale(LC_CTYPE,"zh_CN")的返回值,我这里反正是null,表示函数失败,在/usr/src/lib/libc/locale/gbk.c中的函数_GBK_mbrtowc,就是gbk编码到wchar的转换函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP