当前位置: 首页 > news >正文

响应式网站建设服务提供商网站建设厘金手指下拉12

响应式网站建设服务提供商,网站建设厘金手指下拉12,自己有网站 做app吗,微信官网免费下载安装Qt中translate、tr关系 与中文问题2010-09-22 00:15题外话#xff1a;何时使用 tr #xff1f; 在论坛中漂#xff0c;经常遇到有人遇到tr相关的问题。用tr的有两类人#xff1a; (1)因为发现中文老出问题#xff0c;然后搜索#xff0c;发现很多人用tr#xff0c;于是他…Qt中translate、tr关系 与中文问题2010-09-22 00:15题外话何时使用 tr 在论坛中漂经常遇到有人遇到tr相关的问题。用tr的有两类人 (1)因为发现中文老出问题然后搜索发现很多人用tr于是他也开始用tr(2)另一类人确实是出于国际化的需要将需要在界面上显示的文件都用tr包起来这有分两种 (2a) 用tr包住英文(最最推荐的用法源码英文然后提供英文到其他语言的翻译包)(2b) 用tr包住中文(源码用中文然后提供中文到其他语言的翻译包) 注意哦如果你正在用tr包裹中文字符却不属于(2b)那么这是个信号 你在误用tr你需要的是QString而不是tr 如果你确实属于(2b)请做好心理准备你可能还会遇到很多困难,请考虑Qt国际化源码含中文时的点滴分析 tr 是做什么的下面二者的区别是什么 QString text1 QObject::tr(hello);QString text2 QString(hello); tr是用来实现国际化如果你为这个程序提供了中文翻译包(其中hello被翻译成中文你好)那么text1的内容将是中文你好如果你为程序提供且使用日文翻译包那么text1的内容将是日文。 tr是经过多级函数调用才实现了翻译操作是有代价的所以不该用的时候最好不要用。 关注的对象 本文关注的是tr或translate中包含中文字符串的情况 QObject::tr() QCoreApplication::translate() QTextCodec::setCodecForTr 这个问题本多少可说的。因为涉及到的编码问题和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中使用中文不是个好主意。不过既然总有人用无论是(1)还是(2b)而且总有人遇到问题所以还是简单整理一下吧。 相比QCoreApplication::translate大家用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。 如果你只关心乱码问题到此为止就可以了(下面不再关注编码)。如果想对tr进一步了解不妨。。继续。。 QCoreApplication::translate 我们知道tr是用于实现程序的国际化(或者说多语言翻译)看Qt相关资料的话我们知道实现该功能的还有下面这个函数 QString QCoreApplication::translate ( const char * context, const char * sourceText, const char * disambiguation, Encoding encoding, int n ) 其实这个才是真正进行翻译操作的函数前面我们提到的tr最终是通过调用该函数来实现翻译功能的(稍后我们会看tr是如何调用translate的)。 对tr和这个函数manual中都有比较详尽的解释。我们这儿简单看一下它的这几个参数 context 上下文一般就是需要翻译的字符串所在的类的名字sourceText 需要翻译的字符串。(我们关注的编码其实就是它的编码)disambiguation 消除歧义用的。(比如我们的类内出现两处close一处含义是关闭另一处含义是亲密的。显然需要让翻译人员知道这点区别)encoding 指定编码。它有两个值 CodecForTr 使用setCodecForTr()设置的编码来解释 sourceText UnicodeUTF8 使用utf8编码来解释 sourceText其实这两个分别对应tr和trUtf8 n 处理单复数(对中文来说不存在这个问题) tr与translate 这两个函数的说明一个在QObject的manual另一个在QCoreApplication的manual中。 介绍一下tr与translate的关系。前面提到了tr调用的是translate。如果仅仅这样一说没有证据还真难以让大家相信。好吧继续 tr 在何处定义 你可能说这不废话吗manual中写得明白的它是QObject的静态成员函数。而且还有源码为证 //来自 src/corelib/kernel/qobject.h #ifdef 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)。 啊也就是说这是假的。那么真正的定义呢在一个大家都很熟悉的地方,猜猜看 这就是 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 \virtual 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); } \static 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 文件内(你随时可以验证的)。 staticMetaObject 是一个 QMetaObject 类的实例我们继续看一下该类的源码 /*!\internal */QString QMetaObject::tr(const char *s, const char *c) const{return QCoreApplication::translate(d.stringdata, s, c, QCoreApplication::CodecForTr);}/*!\internal */ QString QMetaObject::trUtf8(const char *s, const char *c) const { return QCoreApplication::translate(d.stringdata, s, c, QCoreApplication::UnicodeUTF8); } 至此我们应该都看清楚了。我们的 Q_OBJECT 宏展开后为生成 tr tr调用QCoreApplication的translate函数。而该函数需要指定编码。
http://www.pierceye.com/news/785679/

相关文章:

  • 教育培训网站建设方案鞍山建设信息网站
  • 重庆网站建设哪家强平台如何做推广
  • 安徽省建设安全监督站的网站网站建设公司一般多少钱
  • 服装网站建设策划书3000字软件开发包含网站开发吗
  • 免费网站的建设绵阳网站建设制作
  • 学生处网站建设招标公告网站包括哪些主要内容
  • 成都门户网站建设多少钱聚合广告联盟
  • 坦克大战网站开发课程设计报告软文营销的本质
  • 美食网站开发网站登录验证码是怎么做的
  • 电子商务网站排名辽宁省建设工程信息网业绩公示
  • 天津建设科技杂志的官方网站wordpress cnzz插件
  • 滨州建设网站太原网站建设优化
  • 记事本做网站怎么改字体包装设计模板设计素材
  • 下载软件的网站推荐thinkphp和wordpress
  • 青海省城乡和住房建设厅网站合肥小吃培训网页设计
  • 财经门户网站建设django校园网站开发
  • 泉州网站建设报价广东建设厅网站
  • 建设网站的源代码的所有权wordpress网站打开慢
  • 印度外贸网站有哪些家居小程序源码下载
  • 上海网站建设中心pc官方网站
  • 深圳企业网站制作公司查询西安网站设计哪家好
  • 大埔做网站手机qq邮箱发布了wordpress
  • 寻找南昌网站设计单位网站建设 中企动力医院
  • 中间商可以做网站吗平面广告设计师的工作内容
  • 网站建设用户分析做网站有什么软件
  • 洛阳网站建设启辰网络wordpress怎么破解查看
  • 长沙市网站设计公司厦门建设网站建站
  • 网站做链轮会被惩罚吗网站开发系统
  • 一般做企业网站需要什么资料WordPress情侣博客模板
  • 网站开发教程公司哪些官网用wordpress