关于Qt的字符编码问题(2)

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;

你可能感兴趣的:(String,null,System,存储,qt,Codec)