qt中中文乱码,使用QString或者tr()均出现乱码。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NewNicholas/article/details/87873848

qt中中文乱码,使用QString或者tr()均出现乱码。

微软VC编译器源代码使用GB2312编码进行保存。"我是汉字" 是C语言中的字符串,它是char型的窄字符串。保存成带BOM的UTF-8,用微软cl编译器时,汉字本身是UTF-8编码,但程序内保存时却是对应的GBK编码。QString 内部采用的是Unicode。当你需要从窄字符串 char* 转成Unicode的QString字符串的,你需要告诉QString你的这串char* 中究竟是什么编码?设置QString默认采用的编码。而究竟采用哪一个,一般来说就是源代码是GBK,就用GBK,源代码是UTF-8就用UTF-8。

源码中的汉字字符串在生成可执行文件的过程中被转换成了本地编码(实际上不止汉字,字母也会被转换)。Qt内部是使用Unicode编码的,即QString保存的是Unicode编码的字符串。所有使用QString的函数都认为QString内部是Unicode字符串。

exe中的字符串编码始终是本地编码,与源代码文件的编码无关。 

Qt内部需要使用Unicode编码的字符串才能正确处理(显示等操作)。 

由于二者不同,所以对于汉字来说,必须经过转换

 

微软VC编译器源代码使用GB2312编码进行保存。源码中的汉字字符串在生成可执行文件的过程中被转换成了本地编码。Qt内部是使用Unicode编码,即QString保存的是Unicode编码的字符串。Qt内部需要使用Unicode编码的字符串才能正确处理。使用QString的函数默认QString内部是Unicode字符串。由于二者不同,所以对于汉字来说,需要经过转换,否则出现乱码。QString的成员函数知道按照何种编码来处理字符串。

解决:

1)预处理,根据设置的本地字符集转换,能正确转换含有中文的QString。

#pragma execution_character_set("utf-8")  //在要加中文的cpp或h文件加入该预处理,设置本地字符集转换,VC编译器把字符串常量按照UTF-8编码

2)fromLocal8Bit() 可以把中文转为Unicode

eg:QString str = QString::fromLocal8Bit("中文简体");

3)实现非Unicode编码数据与Unicode编码数据之间的转换

    QByteArray byteArrty  = u8"안녕하세요";

    QString s = QString::fromUtf8(byteArrty);

    QString ss = u8"안녕하세요";

 

4)实现非Unicode编码数据与Unicode编码数据之间的转换:QTextCodec

         QByteArray encodedString = "1.中文简体";

    QTextCodec *codec = QTextCodec::codecForName("GB2312");

    QString aa1 = codec->toUnicode(encodedString);

    QByteArray encodedString2 = "2.い地㎝瓣 いゅ羉砰";//中华人民共和国中文繁体

    QTextCodec *codec2 = QTextCodec::codecForName("Big5");

    QString aa2 = codec2->toUnicode(encodedString2);

    QByteArray encodedString3 = "3.てててこんにちはおはようこんにちは";

    QTextCodec *codec3 = QTextCodec::codecForName("EUC-JP");

    //QTextCodec *codec3 = QTextCodec::codecForName("GB2312");

    QString aa3 = codec3->toUnicode(encodedString3);

    QByteArray encodedString4 = "4.안녕하세요";

    QTextCodec *codec4 = QTextCodec::codecForName("EUC-KR");

    QString aa4 = codec4->toUnicode(encodedString4);

    ui.label->setText(aa1);

    ui.label_2->setText(aa2);

    ui.label_3->setText(aa3);

    ui.label_4->setText(aa4);

    ui.label_5->setText(QString::fromLocal8Bit("中文简体,简体中文"));

    ui.label_6->setText(QString::fromLocal8Bit("こんにちは 123abc てててててて"));

韩语乱码原因:字符串“안녕하세요”非韩文输入法输入,在notepad++下,调整文件为韩语EUC-KR编码,字符串“안녕하세요”变为乱码。GB2312支持日文平假名,fromLocal8Bit()可用。

 

更改系统区域设置,改为朝鲜语(韩国),再次运行该程序,韩文显示正常其他大多有问题。

展开阅读全文

没有更多推荐了,返回首页