setCodecForCString setCodecForTr setCodecForLocale

来源:互联网 发布:mac bt下载工具 编辑:程序博客网 时间:2024/06/06 09:56

如只是提供给本地用户使用,无需国际化

先调用下面两个函数之一

QTextCodec *textc=QTextCodec::codecForName(”gbk”);

QTextCodec *textc=QTextCodec::codecForName(”utf8″);

然后调用下面3个函数之一

QTextCodec::setCodecForCStrings(textc);

QTextCodec::setCodecForTr(textc);

QTextCodec::setCodecForLocale(textc);

至于调用哪一个是不知道的,只好挨着试,反正组合也不多。问题是解决了。但下次还是这么试。

下面我们来看看这几个函数都作用在什么地方。

1. setCodecForCStrings(textc)

这个函数主要用在用字符常量或者QByteArray构造QString对象时使用的默认编码方式。比如下面一个例子

23 int main(int argc,char *argv[]){

24     QApplication app(argc,argv);

25

26     QTextCodec *tc=QTextCodec::codecForName(”utf8″);

27     QTextCodec::setCodecForCStrings(tc);

28     QString str(”宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”);

29     QPushButton ww(str);

30     ww.show();

31

32     app.exec();

33 }

如果把26,27行的地方注释掉,那么我们在QPushButton上看到的将是一堆乱码。因为在默认情况下QString把构造函数的字符串参数当成标准拉丁字符,很显然是会出现乱码的。如果是在Linux下的话你在编辑器里输入的时候,默认文本格式是”utf8″,如果你是在windows下做开发那么26行的地方很可能要改成”gbk”了。

2.  setCodecForTr(textc)

这个函数的作用是设置传给tr函数时的默认字串编码

23 int main(int argc,char *argv[]){

24     QApplication app(argc,argv);

25

26     QTextCodec *tc=QTextCodec::codecForName(”utf8″);

27     QTextCodec::setCodecForCStrings(tc);

28     QString str(QObject::tr(”宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”));

29     QPushButton ww(str);

30     ww.show();

31

32     app.exec();

33 }

同样一个例子,我在28行的地方加了tr之后,运行的结果又不能正常显示中文了。需要将27行的函数改成setCodecForTr就可以了。

3. QTextCodec::setCodecForLocale(textc)

这个函数主要用于设置和对本地文件系统读写时候的默认编码格式。比如通过流读取一个文件时内容时的编码格式。或者通过qDebug()输出打印信息时的编码。

7 int main(int argc,char *argv[]){

8     QTextCodec *tc=QTextCodec::codecForName(”utf8″);

9     QTextCodec::setCodecForCStrings(tc);

10     QString str(”宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”);

11

12     QTextCodec *tl=QTextCodec::codecForName(”utf8″);

13     QTextCodec::setCodecForLocale(tl);

14     qDebug()<<str;

15 }

你也可以试试把第12行去掉或者编码改成”gbk”,就会大概明白setCodecForLocale的作用了。

 

--------------------------------------------------------------------------------------------------------------------

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

从UTF8编码到GB编码的字符串转换方法:
QString Utf8_To_GB(QString strText)
{
    return QString::fromUtf8(strText.toLocal8Bit().data());
}

至于从GB到UTF8,那大家就经常用了:
QString GB_To_Utf8(char *strText)
{
    return QString::fromLocal8Bit(strText);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在Qt4中,国内很多新手都喜欢——不分青红皂白地使用如下3行代码

QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)
QTextCodec::setCodecForLocale(...)尽管之前零零散散写过一点这方面的内容,比如

QString 与中文问题

Qt中translate、tr关系 与中文问题

Qt国际化(源码含中文时)的点滴分析

但是,敢死队员还是一批一批的 ... 让人少多有些无奈

症结?
在国内,之所以用很多人用这3行代码,是因为他们在源代码的const char*这种窄字符串中使用了中文。

然后,发现。不对啊,咋全是乱码呢?于是上网搜索,发现其他人用的这3行代码

于是,加上试试。发现:在自己的当前环境下(固定系统、固定地区语言设置、固定编译环境)还真的没有乱码了。

于是乎?完全不考虑那3行代码的作用了,反正自己能用就行了,管它什么副作用呢!!

Qt5
在Qt5中,这个问题终于不复存在了,因为

这两个函数

QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)被直接去掉了。

这样一来,受影响的直接是如下代码了:

QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")好消息/坏消息?
坏消息:

现在Qt5中尽管去掉了setCodecXXX这两个函数,但是默认编码还是latin1。如果你要想使用

"我是中文"这样的字符串,必须自己使用QTextCodec或这QString::fromXXX 这种东西进行转换

好消息 是:

Qt5发布之时,默认将会是utf8编码,完全可以将你从Qt编码问题解放出来。

坏消息,如果使用的是 MSVC2005/2008/2010,可能无法使用utf8编码,于是

下面的代码

QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")将不会工作。

因为从MSVC2005起,你无法给编译器设置字符串要使用的编码。尽管2003之前,也无法设置,但是它会遵循源码文件的编码。而2005就自作聪明了,即使你源码文件保存成不带BOM的utf8,它都会试图帮你转换一下。
好消息是什么呢?

如果你在Windows下,且使用的是MinGW,那么只要你将源码文件保存成utf8,前面的代码将直接可以工作(无须其他设置)

如果你在其他平台了,那么应该都默认是utf8文件。同样无须进行设置。

好消息

如果你的编译器支持C++11,那么,你可以直接使用


QString s = u8"我是中文";坏消息

主流编译器还都不怎么支持C++11

 

作者 dbzhang800

 

原创粉丝点击