LinuxSir.cn,穿越时空的Linuxsir!

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

中文字符编码转换问题

[复制链接]
发表于 2007-3-25 15:48:15 | 显示全部楼层 |阅读模式
一个中文字符串“浏览事件历史”,在utf-8字符集下,在konsole中使用Vi编辑器看到的是这样的“ä¯ÀÀʼþÀúÊ·”乱码,如果用KDE下的Kate编辑器并使用GB2312字符集,则能看到正确的中文字符,但是在konsole里使用GB2312字符集,则看到的仍然是乱码。使用iconv()函数将该串转换为GB2312字符,看到的仍然是乱码。现在该串通过strcpy()方式提取到内存种了,但是如何在窗口中正确显示这个中文字符串一直困扰着程序的设计,请问使用何种方法才能解决?
发表于 2007-3-25 17:34:22 | 显示全部楼层
你问题描述的不清楚, 如果你只是想在konsole 中正常显示,这么搞就可以了

QString str = "XXXX"; // utf8 编码字串
printf("%s\n", str.local8Bit().data());

str.local8Bit() 返回的是本地编码的 QCString, QCString 的 data() 方法得到 char *
回复 支持 反对

使用道具 举报

发表于 2007-3-25 17:39:11 | 显示全部楼层
看到你说konsole, kate, 就以为你用的qt。 如果你用iconv 转成gb码后,显示乱码, 只可能是:
1.你的locale 可能不是gb码的。
2.你转码有问题。(就是iconv 那里弄错了)

再检查一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-25 20:43:26 | 显示全部楼层
的确,不是Qt程序。问题 的背景是:1,用fwrite()将一个结构写入到文件中,该结构里有一个字符数组成员,通过strcpy()将该成员赋值为“浏览事件历史”,由于文件是二进制的,因此通过Vi无法看到它的中文字符。2,用fread()将该结构提取到内存,为了观察这个字符串的数据,我将该串又重写道一个文件中,然后将Vi的编码方案设为utf8,此时打开这个文件,看到的字符串是这个“ä¯ÀÀʼþÀúÊ·”,再将Vi的编码方案设为GB2312,打开文件看到仍然是乱码。3,用Kate打开这个文件,编码方案改为gb2312,这时就显示了正确的字符了。

我用SlicEdit作为编辑编译工具,但凡是碰到需要处理中文的地方,均用Kate编辑,以保证中文字符符合GB2312编码,也就是说在写入结构数据前,像strcpy(mem, "浏览事件历史")函数中第二个参数在kate下一定是可以正确显示的,但是写入二进制文件时,该结构的中文编码应该是utf8的(因为locale中的中文环境被设成了utf8)。现在的问题是,用fread()提取的内容应该是utf8码,所以用iconv做了utf8到GB2312的转换,但是显示让然是乱码。这里一个问题之一是:为什么同一字符串在Vi下看是乱码,在kate下看又是正常的呢?
回复 支持 反对

使用道具 举报

发表于 2007-3-26 13:54:29 | 显示全部楼层
百度 "vi 中文 乱码 解决"
回复 支持 反对

使用道具 举报

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

本版积分规则

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