QT使用Unicode来存储,绘制以及操作字符串。在很多情况下,可能想要使用不同的编码方式来处理数据。例如大部分的日语文件都被存储在 Shift-JIS或者 ISO2022的文件中,而俄罗斯的用户常常使用KOI8-R或者CP1251编码方式。QT提供了一个QTextCodec类集合来从Unicode格式转化到相应的格式。
通过QTextCodec可以对程序预设编码方式,有以下三种:
void setCodecForCStrings(QTextCodec *codec);
void setCodecForLocale(QTextCodec *c);
void setCodeForTr(QTextCodec *c);
例如:
QTextCodec gbk = QTextCodec::codecForName("GB18030");
QTextCodec::setCodeForTr(gbk);
下面对这三种方法进行解析:
1.void setCodecForCStrings(QTextCodec *codec);
对程序构造字符串的编码方式,例如:
QString str = “中文”;
那么“中文”,是用GB18030编码格式存储。
2.void setCodecForLocale(QTextCodec *c);
对本地字符编码设定,即系统的编码格式。Qt中用于控制读入和写出文件系统时的字符编码由QTextCodec::setCodecForLocale()所决定,
3.void setCodeForTr(QTextCodec *c);
跟第一种方式相识,是程序在QObject::tr()用到的地方,进行编码显示。
例如:
QString str = tr(“中文”);
那么str可以进行显示,而不会乱码
这三种方法有相应的get方法:
QTextCodec * codecForCStrings();
QTextCodec * codecForLocale();
QTextCodec *codecForTr();
注意:
codecForCStrings()和 codecForTr()方法,默认值为0,即没有提前设定编码方式,会产生返回NULL,而codecForLocale(),在默认情况下,返回System。
QTextCodecs可以使用如下一些本地编码转换为Unicode字符串。假设你已经在俄罗斯KOI8 - R的编码方式编码的一些字符串,并想将其转换为Unicode。最简单的方法做到这一点是这样:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
在此之后,转换为Unicode字符串保存的文本。从Unicode字符串转换为本地编码是一样简单:
QString string = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QByteArray encodedString = codec->fromUnicode(string);
通用的方式是在程序的开头加上:
QTextCodec *gbk = QTextCodec::codecForName("GB18030");
QTextCodec::setCodecForTr(gbk);
QTextCodec::setCodecForCStrings(gbk);
QTextCodec::setCodecForLocale(gbk);
转UTF-8编码:
QString str = "中文" ;
QByteArray coded = str.toUtf8();
QString string = utf8->toUnicode(coded);
qDebug() << "QObject::trUtf8:" << QObject::trUtf8(coded);
qDebug() << "string" << string;
由UTF-8编码转GBK编码:
QByteArray code = string.toLocal8Bit();
QString str1 = gbk->fromUnicode(code);
qDebug() << "str1:" << str1;