中文字符串ANSI转UTF8的问题

weichaogui 2011-12-21 02:59:14
本人在Linux ARM平台下用Qt4.7操作一IC卡读卡器,该读卡器要求写入或传回的数据均为ANSI格式。而我的应用程序字符编码为UTF8,这导致显示传回的数据时出了问题:英文字符都能显示,唯独中文字符全为乱码。

我在main()函数中添加下面两条语句

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));


在往读卡器写入数据时,通过下面的调用能把LineEdit控件里的中文正确转为ANSI的字符。

//把控件中的内容转为ANSI
dataLineEdit->text().toLocal8Bit().data();


但是收到传回的包含有中文的数据时,通过下面的调用显示为乱码,但英文能正常显示。

dataLineEdit->setText(QString::fromLocal8Bit(data));//data为接收到的数据,为ANSI的字符串


本人刚接触Qt不久,希望各位大侠不吝赐教,谢谢。
...全文
562 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weichaogui 2011-12-29
  • 打赏
  • 举报
回复
CSDN怎么显示不了回复?奇怪。
weichaogui 2011-12-27
  • 打赏
  • 举报
回复
这个问题困扰了我好几天,通可Google、Baidu,找了好些方案。

最初下载了libiconv库,使用其中的iconv_open(),iconv(),iconv_close()来转换编码,经测试,在X86下可行,但交叉编译移到ARM目标板后,iconv()转换时,只要字符串中有中文,就返回失败,实在是搞不懂。而且我的程序本来只有70K左右,静态链接libiconv.a后,一下子暴涨N倍。无奈只得放弁这个方法。

后来我参考Windows下WideCharToMultiByte()和MultiByteToWideChar()用来进行ANSI与UNICODE之间的转换,在Linux下,mbstowcs()可用,使用该函数之前,需先调用setlocale(LC_ALL,"zh_CN.GB18030"),这方法在X86下同样可行,一到目标板就失败。然后又只有另觅他法。

最后通过gbk与unicode码表的映射关系,通过查表的方式解决,步骤如下:

1、把字符从gbk转至unicode,这一步通过查码表得到,码表的构建参照了下面这篇文档。
http://www.vckbase.com/document/viewdoc/?id=1576

2、通过unicode转至utf8,这一步参照了下面这篇文档。
http://www.vckbase.com/document/viewdoc/?id=1770

如果不想自己写代码,那么下面的这个源码下载后可直接使用,它也是通过gbk→unicode→utf8的方式转换的,效果立杆见影。
http://download.csdn.net/detail/jingjing_123/2659281#comment

谢谢上面几位作者的无私奉献,也多谢各位回贴的热心人。
weichaogui 2011-12-27
  • 打赏
  • 举报
回复
这个问题困扰了我好几天,通可Google、Baidu,找了好些方案。

最初下载了libiconv库,使用其中的iconv_open(),iconv(),iconv_close()来转换编码,经测试,在X86下可行,但交叉编译移到ARM目标板后,iconv()转换时,只要字符串中有中文,就返回失败,实在是搞不懂。而且我的程序本来只有70K左右,静态链接libiconv.a后,一下子暴涨N倍。无奈只得放弁这个方法。

后来我参考Windows下WideCharToMultiByte()和MultiByteToWideChar()用来进行ANSI与UNICODE之间的转换,在Linux下,mbstowcs()可用,使用该函数之前,需先调用setlocale(LC_ALL,"zh_CN.GB18030"),这方法在X86下同样可行,一到目标板就失败。然后又只有另觅他法。

最后通过gbk与unicode码表的映射关系,通过查表的方式解决,步骤如下:

1、把字符从gbk转至unicode,这一步通过查码表得到,码表的构建参照了下面这篇文档。
http://www.vckbase.com/document/viewdoc/?id=1576

2、通过unicode转至utf8,这一步参照了下面这篇文档。
http://www.vckbase.com/document/viewdoc/?id=1770

如果不想自己写代码,那么下面的这个源码下载后可直接使用,它也是通过gbk→unicode→utf8的方式转换的,效果立杆见影。
http://download.csdn.net/detail/jingjing_123/2659281#comment

谢谢上面几位作者的无私奉献,也多谢各位回贴的热心人。
Sky-Yang 2011-12-23
  • 打赏
  • 举报
回复
试一下
dataLineEdit->setText(QString::fromAscii(data));//data为接收到的数据,为ANSI的字符串
既然是ANSI,怎么能用QString::fromLocal8Bit
j_qinshou 2011-12-23
  • 打赏
  • 举报
回复
QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));试试看
gnimgnot 2011-12-21
  • 打赏
  • 举报
回复
跟操作系统的编码集也有关系。
我的win2003也折腾了很久。。
「已注销」 2011-12-21
  • 打赏
  • 举报
回复
传回的字符串是什么编码的?
starnight1981 2011-12-21
  • 打赏
  • 举报
回复
唉,认识字符编码,其实跟qt关系不大。需要多了解一下字符编码的知识。

其实ANSI 这个提法是很不好的,害了很多初学者。

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧