首页| 论坛| 消息

标题:Qt中translate、tr关系 与中文问题
作者:wbyqy
日期:2011-04-11 21:57
内容:

Qt中translate、tr关系 与中文问题2010-10-10 15:11关注的对象
本文关注的是 QObject::tr(),QCoreApplication::translate()及QTextCodec::setCodecForTr与中文问题。以及tr与translate之间的关系。
中文问题本没多少可说的。因为涉及到的编码问题和QString 与中文问题中是完全一样的,只不过一个是用的setCodecForCStrings一个用的是setCodecForTr。
简单回顾QString的中文问题
QString 采用的unicode,在中文支持上不存在任何问题
"我是中文" 这是传统的 const char * 的窄字符串
当将窄字符串赋值到QString时,我们需要告诉它我们的窄串采用的何种编码(gbk?、utf-8?)
究竟何种编码主要取决于我们的源代码文件的编码(windows上一般是gbk,其他平台一般utf-8)
例子:
QString s1 = "中文";QString s2("中文");QString s3; s3 = "中文";
s1、s2 用的是QString的构造函数QString ( const char * str )
s3 用的是QString的赋值操作符 QString & operator= ( const char * str)
如果不指定编码,s1,s2,s3将全部都是(国内大多数人所称的)乱码。因为QString将这些const char *按照latin1来解释的,而不是用户期待的gbk或utf8。

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
这两条语句中的一条可以解决问题,至于如何选择,此处不再重复。

QObject::tr
大家用的最多的就是tr了,尽管不少人不清楚tr究竟是做什么的^_^
tr("我是中文");
这调用的是下面这个函数(至少我们可这么认为是)。
QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )
与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。
如何告诉tr你写的这几个汉字在磁盘中保存的是何种编码呢?这正是
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
所做的。这两个选择的原则,由于和前文完全一样,此处也不再重复。
如果你的编码采用的utf8,可以直接使用trUtf8而不必设置setCodecForTr。
如果你只关心乱码问题,到此为止就可以了(下面不再关注编码)。如 ..


#1 [kunkka 04-11 22:36]
好强大, 受教了~ 不过还是没有具体的翻译实现啊! 很期待LZ再发一贴 关于具体如何实现不同语言翻译问题, 这个翻译问题 到现在我都没怎么弄懂~~~纠结 !!!

回复 发表
主题 版块