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

上传人:tia****nde 文档编号:36844888 上传时间:2018-04-03 格式:DOC 页数:4 大小:45KB
返回 下载 相关 举报
Qt中translate、tr关系与中文问题_第1页
第1页 / 共4页
Qt中translate、tr关系与中文问题_第2页
第2页 / 共4页
Qt中translate、tr关系与中文问题_第3页
第3页 / 共4页
Qt中translate、tr关系与中文问题_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《Qt中translate、tr关系与中文问题》由会员分享,可在线阅读,更多相关《Qt中translate、tr关系与中文问题(4页珍藏版)》请在金锄头文库上搜索。

1、Qt 中 translate、tr 关系 与中文问题题外话:何时使用题外话:何时使用 tr ? 在论坛中,经常遇到有人遇到 tr 相关的问题。用 tr 的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用 tr,于是他也开始用 tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的文件都用 tr 包起来,这有 分两种: (2a) 用 tr 包住英文(最最推荐的用法,源码英文,然后提供英文到其他语言的翻译包) (2b) 用 tr 包住中文(源码用中文,然后提供中文到其他语言的翻译包) 注意哦,如果你正在用注意哦,如果你正在用 tr 包裹中文字符,却不属于包裹中文字符,却不

2、属于(2b),那么,这是个信号:,那么,这是个信号: 你在误用 tr 你需要的是 QString,而不是 tr 如果你确实属于如果你确实属于(2b),请做好心理准备,你可能还会遇到很多困难,请做好心理准备,你可能还会遇到很多困难,请考虑请考虑 Qt 国际化(源 码含中文时)的点滴分析 tr 是做什么的?下面二者的区别是什么?是做什么的?下面二者的区别是什么?QString text1 = QObject:tr(“hello“); QString text2 = QString(“hello“); tr 是用来实现国际化,如果你为这个程序提供了中文翻译包(其中 hello 被翻译成中文 “你好“

3、),那么 text1 的内容将是中文“你好“;如果你为程序提供且使用日文翻译包,那么 text1 的内容将是日文。 tr 是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要 用。 关注的对象 本文关注的是 tr 或 translate 中包含中文字符串的情况: QObject:tr() QCoreApplication:translate() QTextCodec:setCodecForTr 这个问题本多少可说的。因为涉及到的编码问题和 QString 与中文问题中是完全一样 的,只不过一个是用的 setCodecForCStrings 一个用的是 setCodecFor

4、Tr。 简单回顾 QString 的中文问题 QString 采用的采用的 unicode,在中文支持上不存在任何问题,在中文支持上不存在任何问题 “我是中文“ 这是传统的 const char * 的窄字符串 当将窄字符串赋值到当将窄字符串赋值到 QString 时,我们需要告诉它我们的窄串采用的何种编码时,我们需要告诉它我们的窄串采用的何种编码 (gbk?、utf-8?) 究竟何种编码主要取决于我们的源代码文件的编码究竟何种编码主要取决于我们的源代码文件的编码(windows 上一般是上一般是 gbk,其他平台一,其他平台一 般般 utf-8) 例子: QString s1 = “我是中文

5、“; QString s2(“我是中文“);QString s3; s3 = “我是中文“s1、s2 用的是 QString 的构造函数QString ( const char * str ) s3 用的是 QString 的赋值操作符 QString QTextCodec:setCodecForCStrings(QTextCodec:codecForName(“UTF-8“) 这两条语句中的一条可以解决问题,至于如何选择,此处不再重复。QObject:tr 说实话说实话,在 tr 中使用中文不是个好主意。不过既然总有人用(无论是(1)还是(2b)), 而且总有人遇到问题,所以还是简单整理一下

6、吧。相比QCoreApplication:translate,大家用 tr 应该用的很多了,尽管不少人不清楚tr 究竟是做什么的。 tr(“我是中文“); 这调用的是下面这个函数(至少我们可这么认为是)。QString QObject:tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) 与 QString(“我是中文“)完全一样,你必须告诉 tr 这个窄字符串是何种编码?你不告诉它, 它就用 latin1。于是所谓的乱码问题所谓的乱码问题就出来了。 如何告诉如何告诉 tr 你写的这几个汉字在磁盘

7、中保存的是何种编码呢?这正是你写的这几个汉字在磁盘中保存的是何种编码呢?这正是QTextCodec:setCodecForTr(QTextCodec:codecForName(“GB2312“); QTextCodec:setCodecForTr(QTextCodec:codecForName(“UTF-8“); 所做的。这两个选择的原则,由于和前文完全一样,此处也不再重复。 如果你的编码采用的 utf8,可以直接使用 trUtf8 而不必设置 setCodecForTr。 如果你只关心乱码问题,到此为止就可以了(下面不再关注编码)。如果想对 tr 进一步了解, 不妨。继续。QCoreAppl

8、ication:translate 我们知道 tr 是用于实现程序的国际化(或者说多语言翻译),看 Qt 相关资料的话,我们知道 实现该功能的还有下面这个函数:QString QCoreApplication:translate ( const char * context, const char * sourceText, const char * disambiguation, Encoding encoding, int n ) 其实,这个才是真正进行翻译操作的函数,前面我们提到的 tr 最终是通过调用该函数来实 现翻译功能的(稍后我们会看 tr 是如何调用 translate 的)。

9、对 tr 和这个函数,manual 中都有比较详尽的解释。我们这儿简单看一下它的这几个参数:context 上下文,一般就是需要翻译的字符串所在的类的名字 sourceText 需要翻译的字符串。(我们关注的编码其实就是它的编码) disambiguation 消除歧义用的。(比如我们的类内出现两处“close“,一处含义是关闭,另 一处含义是亲密的。显然需要让翻译人员知道这点区别) encoding 指定编码。它有两个值 CodecForTr 使用 setCodecForTr()设置的编码来解释 sourceText UnicodeUTF8 使用 utf8 编码来解释 sourceText

10、其实这两个分别对应 tr 和 trUtf8 n 处理单复数(对中文来说,不存在这个问题) tr 与 translate这两个函数的说明,一个在 QObject 的 manual,另一个在 QCoreApplication 的 manual 中。介绍一下 tr 与 translate 的关系。前面提到了,tr 调用的是 translate。如果仅仅这样一说, 没有证据,还真难以让大家相信。好吧,继续 tr 在何处定义 你可能说:这不废话吗,manual 中写得明白的,它是 QObject 的静态成员函数。而且还 有源码为证: /来自 src/corelib/kernel/qobject.h #i

11、fdef qdoc static QString tr(const char *sourceText, const char *comment = 0, int n = -1); static QString trUtf8(const char *sourceText, const char *comment = 0, int n = -1); #endif 嘿嘿,差点就被骗了,发现没:它们被预处理语句包住了。 这说明了什么呢?说明了这段代码仅仅是仅仅是用来生成 Qt 那漂亮的文档的(qdoc3 从代码中抽 取信息,生成一系列的 html 格式的 manual)。 啊,也就是说,这是假的。那么

12、真正的定义呢?在一个大家都很熟悉的地方,猜猜看? 这就是Q_OBJECT 该宏的定义在 src/corelib/kernel/qobjectdefs.h 中#define Q_OBJECT public: Q_OBJECT_CHECK static const QMetaObject staticMetaObject; Q_OBJECT_GETSTATICMETAOBJECT virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); QT_TR_FUNCTIONS virtua

13、l int qt_metacall(QMetaObject:Call, int, void *); private: 其中的宏 QT_TR_FUNCTIONS# define QT_TR_FUNCTIONS static inline QString tr(const char *s, const char *c = 0) return staticMetaObject.tr(s, c); static inline QString trUtf8(const char *s, const char *c = 0) return staticMetaObject.trUtf8(s, c); st

14、atic inline QString tr(const char *s, const char *c, int n) return staticMetaObject.tr(s, c, n); static inline QString trUtf8(const char *s, const char *c, int n) return staticMetaObject.trUtf8(s, c, n); 现在看到:tr 调用的是 staticMetaObject 对象的 tr 函数,staticMetaObject 的定义在 moc 生成的 xxx.moc 或 moc_xxx.cpp 文件内(

15、你随时可以验证的)。 staticMetaObject 是一个 QMetaObject 类的实例,我们继续看一下该类的源码:/*!internal */QString QMetaObject:tr(const char *s, const char *c) constreturn QCoreApplication:translate(d.stringdata, s, c, QCoreApplication:CodecForTr);/*!internal */ QString QMetaObject:trUtf8(const char *s, const char *c) const retur

16、n QCoreApplication:translate(d.stringdata, s, c, QCoreApplication:UnicodeUTF8); 至此,我们应该都看清楚了。我们的我们的 Q_OBJECT 宏展开后为生成宏展开后为生成 tr ,tr 调用调用 QCoreApplication 的的 translate 函数。而该函数需要指定编码。函数。而该函数需要指定编码。个人体会:个人体会:1、利用下面的代码可以直接解决 tr( )中 中文显示乱码的问题,只需这几行代码,其余的什么都不需要。但是,需要把代码保存成简体中文简体中文 (GB2312)。当没有这段代码的时候,即使。当没有这段代码的时候,即使把代码保存成简体中文简体中文(GB2312)也是也是 没有用的。没有用的。QTextCodec *codec=QTextCodec:codecForName(“GBK“);if(codec=NULL)c

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号