免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-12 11:21 |只看该作者 |倒序浏览
我程序里的字符是utf8格式,输出要转到当前locale。写了下面这个函数转换。但是我发现 wctomb 始终不能正确转换──wctomb返回后,*pcmb的第一个字节总是17(10进制),第二个是NULL。(NULL之前应该有2个字节才对)

同样这个例程在 Ubuntu 下运行就没有问题。
作为桥梁的wide-char的值是对的,所以问题应该是 wctomb。


24 int utf8tomb (pchar_t pcmb, const pchar_t pc)
25 {
26     wchar_t wc;
27     setlocale (LC_CTYPE, "en_US.UTF-8");
28     mbtowc (&wc, pc, MB_LEN_MAX);
29     setlocale (LC_CTYPE, "zh_CN.GB2312");
30     return wctomb (pcmb, wc);
31 }

论坛徽章:
0
2 [报告]
发表于 2007-02-12 11:30 |只看该作者
试试 iconv 呢?

论坛徽章:
0
3 [报告]
发表于 2007-02-12 11:36 |只看该作者
iconv可以,但我不想在程序里用libiconv。

论坛徽章:
0
4 [报告]
发表于 2007-02-12 11:40 |只看该作者
那你现在编译的平台?gcc版本?glibc版本?

论坛徽章:
0
5 [报告]
发表于 2007-02-12 16:07 |只看该作者
gcc 3.4.4, Freebsd 6.1 和 gcc 3.4.6 Freebsd 6.2 都试过,一样
glibc 是 2.3.6
你可以试一下在UTF-8编译这个代码

test:
    pchar_t pcmb = new char [10];
    utf8tomb (pcmb, "靠";
    printf("%s\n", pcmb);

再在(utf-运行

./test | iconv -f gb2312

得到的是乱码。在Linux下就得到“靠”

论坛徽章:
0
6 [报告]
发表于 2007-02-13 01:39 |只看该作者
你试下把

  1. 29     setlocale (LC_CTYPE, "zh_CN.GB2312");
复制代码

换成

  1. 29     setlocale (LC_CTYPE, "zh_CN");
复制代码

看看

怀疑是从 UTF-8 到 Gb2312 映射的问题,linux下可用?我现在手边没linux,回头找一个试下

论坛徽章:
0
7 [报告]
发表于 2007-02-13 03:18 |只看该作者
不行的。zh_CN没有指定编码,除了GB2312, GBK, 还有zh_CN.UTF-8一些

论坛徽章:
0
8 [报告]
发表于 2007-02-13 12:04 |只看该作者
我这里直接用 zh_CN 就ok了的,你再check一下?

论坛徽章:
0
9 [报告]
发表于 2007-02-13 12:22 |只看该作者
真的可以了,非常感谢阿,以后常来这里请教了

论坛徽章:
0
10 [报告]
发表于 2007-02-13 12:44 |只看该作者
看来的确是wctomb的问题。setlocale(LC_CTYPE, "")会把LC_CTYPE设成环境变量里的zh_CN.GB2312,不是zh_CN,但是wctomb只认zh_CN……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP