LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1334|回复: 9

c语言新手-关于宽字符的使用问题

[复制链接]
发表于 2006-1-2 01:13:19 | 显示全部楼层 |阅读模式
1,为什么对于传统的ascii版本的char类型也能接受宽字符,如:
   char c[] = "我的";
   sizeof(c)出来的值是5,是不是默认用的就是UTF8编码

2,用strlen检测有宽字符的字符串的长度时会出现错误

我想请教大家的是在我看来,c有些特性或函数内部已经默认支持宽字符,但有些不支持如strlen,
现在的linux函数库好像也没有向windows下的哪些对应的都有宽字符的版本,我要是在这些库函数里
用到宽字符又应该怎么弄呢?

小弟是学习c语言的新手,现在被这些给弄的有点糊涂了,希望各位大哥帮忙!!!
发表于 2006-1-2 14:16:04 | 显示全部楼层
1。我怀疑你用的是gbk
2。从你说的这些好像还看不出默认是否支持宽字符,strlen应该不会支持宽字符,他是按字节计数的

你想要的函数可能glib里有,不过似乎只支持utf8,别的编码需要先转换成utf8再用他提供的函数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-2 16:13:05 | 显示全部楼层
楼上的大哥说的有道理! 但是小弟我好像还是不太明白!!  难道我要想在linux库函数里用宽字符,就必须做相应的编码转换吗? 这样做是不是太麻烦了!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-2 16:13:08 | 显示全部楼层
楼上的大哥说的有道理! 但是小弟我好像还是不太明白!!  难道我要想在linux库函数里用宽字符,就必须做相应的编码转换吗? 这样做是不是太麻烦了!!!
回复 支持 反对

使用道具 举报

发表于 2006-1-2 17:59:48 | 显示全部楼层
如果你的字符来源不是utf8编码的,恐怕就要转下了
回复 支持 反对

使用道具 举报

发表于 2006-1-2 21:15:41 | 显示全部楼层
楼上的越来越牛了
回复 支持 反对

使用道具 举报

发表于 2006-1-2 22:55:29 | 显示全部楼层
Post by aishen944
1,为什么对于传统的ascii版本的char类型也能接受宽字符,如:
   char c[] = "我的";
   sizeof(c)出来的值是5,是不是默认用的就是UTF8编码

绝对不是utf8
utf8,一般的,一个中文字符占3个字节
看这个
http://xcin.linux.org.tw/i18n/pc2000/p3/index.html
这个是全系列
http://xcin.linux.org.tw/i18n/pc2000/
回复 支持 反对

使用道具 举报

发表于 2006-1-2 23:15:46 | 显示全部楼层
估计楼主的locale设置的是GB2312之类的。
我在zh_CN.UTF-8下,得到的是7。(UTF-8中中文一般占3个字符)

个人认为即使与gtk2.0,wxWidgets之类的库交互,一般不用宽字符, 其字符串类提供MB与WC的转换。

UTF-8等MB之类的用char就行了,UCS-2等WC之类的对应的才是wchar_t。
一般接口用MB,内部用WC。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-3 04:28:44 | 显示全部楼层
谢谢大家,小弟总算明白其原理了,程序外围使用mb,内部使用wc即进行mb->wc的转换,外部使用时即执行wc->mb的转换
回复 支持 反对

使用道具 举报

发表于 2006-1-3 09:41:14 | 显示全部楼层
可以看看 man wprintf 的手册,就知道 C 语言里是怎么转换的了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表