首先,要明确一个概念,源代码中的C字符串的编码就是源代码本身的编码。例如,同样是下列源代码,内容如下:
#include <stdio.h>
int main()
{
char *str="你好";
int i,c;
for(i=0;str[i]!=0;i++) {
c=(unsigned char)str[i];
printf("%x ",c);
}
printf("\n");
return 0;
}
在windows下,默认格式是GBK,输出结果:
c4 e3 ba c3
而在linux下,默认格式是UTF-8,上面代码输出:
e4 bd a0 e5 a5 bd
在qt中,如果调用以下代码:
QString str=QString("hello");
QString str="hello";
如果不制定编码,QString将这些const char *按照latin1编码来解释的,并转换为Qt内部使用的Unicode编码。既相当于调用以下函数:
QString QString::fromLatin1(const char *str,int size=-1);
同样,QString包含几个类似的函数从不同格式c字符串进行转换:
QString QString::fromAscii ( const char * str, int size = -1 )
QString QString::fromLatin1 ( const char * str, int size = -1 )
QString QString::fromLocal8Bit ( const char * str, int size = -1 )
QString QString::fromUtf8 ( const char * str, int size = -1 )
我们可以使用:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
设置转换时所使用的函数。
tr函数是用来实现全球化,也就是说提供一个为程序实现不同语言版本的方法。tr中包含的字符串可以设置,从而在不同的语言的操作系统中显示不同的内容。其声明如下:
QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )
所以简单的使用tr不能解决乱码问题。只有那些需要开发不同语言版本的软件,才需要使用tr对不同语言中显示不同文字的部分进行标注。