中文QString转成char类型中造成乱码的原因

QString内部采用的是unicode编码,但是unicode编码有很多种,在实际应用时应制定具体的编码形式,常见的有GBK、GB2312和UTF-8等。

UTF-8是解决国际上字符的一种多字节编码,它包含全世界国家所用到的所有字符,通用性强。英文单字节表示,中文需要三个字节表示。

GBK是国家标准GB2312基础上扩容后并兼容GB2312标准,无论英文中文都用双字节来表示。GBK包含全部中文字符,是中文国家标准的一种编码方式。GB2312是简体中文的码,GBK则支持简体中文和繁体中文。

指定unicode的编码方式一般采用的方法是在main函数中添加如下语句:

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

 此处指定unicode编码方式为GBK编码; 
  

QString转换char操作为

QString path("我是汉字");

QByteArray cpath = path.toLocal8Bit();  注意,这个QByteArray 对象一定要建立

char *p = cpath.data();

此时便完成了中文QString到char类型的转换。但是我们单步运行程序,从调试窗口中观察char中的数据,发现不是”我是汉字“,而是乱码"ÎÒÊǺº×Ö"


这时,我们就会怀疑我们的转换没有成功,其实不然。因为在我们当前所用的QT软件界面中所显示的内容是采用latin编码后的结果,而我们的QString类中的内容”我是汉字“当前采用的是GBK编码,编码结果为ce d2 ca c7 ba ba d7 d6,而这八个字节的数据在latin中就是乱码"ÎÒÊǺº×Ö",我们将cpath对象展开可看到这八个字节的数据正是ce d2 ca c7 ba ba d7 d6,所以转换正确。




你可能感兴趣的:(qt)