函数tr()简单了解
用tr的有两类人:
(1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr
(2)另一类人,确实是出于国际化的需要,将需要在界面上显示的文件都用tr包起来,这有分两种:
(2a) 用tr包住英文(推荐的用法,源码英文,然后提供英文到其他语言的翻译包)
(2b) 用tr包住中文(源码用中文,然后提供中文到其他语言的翻译包)
tr 是做什么的?下面二者的区别是什么?
QString text1 = QObject::tr("hello");
QString text2 = QString("hello");
tr是用来实现国际化,如果你为这个程序提供了中文翻译包(其中hello被翻译成中文”你好”),那么text1的内容将是中文”你好”;如果你为程序提供且使用日文翻译包,那么text1的内容将是日文。
tr是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。
QObject::tr
说实话,在tr中使用中文不是个好主意。不过既然总有人用(无论是(1)还是(2b)),而且总有人遇到问题,所以还是简单整理一下吧。
tr(“我是中文”);
与QString(“我是中文”)完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。
如何告诉tr你写的这几个汉字在磁盘中保存的是何种编码呢?这正是
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
所做的。这两个选择的原则,究竟何种编码主要取决于我们的源代码文件的编码(windows上一般是gbk,其他平台一般utf-8)
如果你的编码采用的utf8,可以直接使用trUtf8而不必设置setCodecForTr。