在linux里QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"))使得汉字显示正常,
但是当linux与windows串口通信时,windows下串口助手无法识别;
当改成QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")时,win传来的汉字能识别,但linux下的汉字却无法正常显示。(程序在linux环境下)
请指教。
------解决方案--------------------
第一种情况,在Linux下:
软件界面中输入Linux程序的字符编码一般是utf8(貌似utf8也是Linux的本地编码)
你使用setCodecForCStrings(xxxxxxx("utf8")),使得QString在获得字符串的时候默认做了一个utf8到unicode的编码转换(QString内部表示是使用unicode的),这是第一次编码转换;在把字符显示到Linux软件界面的时候,又作了一次unicode->本地编码的转换,这是第二次编码转换。
第一次编码转换是你控制和指定的,并且是正确的;第二次转换是Qt控制的,当时是正确的。所以在Linux下汉字显示正常。
串口传输的是带编码的字节流,这个编码应该是unicode
但是,windows的本地编码是GB,于是windows下的串口助手用GB的标准去解码unicode格式的字符流,就乱了
windows->Linux传输乱码道理类似
------解决方案--------------------
用二进制传入,到 linux这边toUtf8, 到windows这边转成ascii
------解决方案--------------------
假如你的字符串保存在某个QString xxx里
串口发送前做一次unicode到GBK的转换:
QTextCodec * codec = QTextCodec::codecForName("GBK") //建立一个unicode与GBK之间的转换器
QByteArray bytesForGBK = codec->fromUnicode(xxx) //unicode转换成gbk
下来就是用串口传送bytesForGBK
------解决方案--------------------
windows应该也可以直接用utf8吧, 也可以解析出汉字的,我们现在做的项目就是全部用utf8的,和linux通信也没什么问题,这样就不用再转码了,在工具-》选项中,默认文本编码也设成utf8, 在下载一个工具gbk转utf8的小工具,把代码也转下,应该传输就没问题了,传输的时候用QByteArray