Qt编码问题

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值