QT 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的中文问题:

1) QString 采用的unicode,在中文支持上不存在任何问题

2) "我是中文" 这是传统的 const char * 的窄字符串

3) 当将窄字符串赋值到QString时,我们需要告诉它我们的窄串采用的何种编码(gbk?、utf-8?)

4) 究竟何种编码主要取决于我们的源代码文件的编码(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。

如果你只关心乱码问题,到此为止就可以了。

有时候我们需要不同的PHP版本来测试,默认自带的6个已经足够,你如果不满意,可以自己自定义任何你需要的PHP版本号。 打开PHPWAMP的Apache2.4站点管理 自定义设置PHP版本案例,几百个PHP版本随意切换 这里我已经建立了6个站点,采用端口来区分的,当然你也可以绑定域名,采用域名来区分不同的站点,站点管理可以用端口区分,也可以用域名区分,是通用的。(端口模式和域名模式的教程可以百度搜索,都有了) 下图我建立了6个不同的PHP版本,这6个版本可以同时运行,这时候我还想要添加一个自定义版本,那么应该什么做呢。 自定义设置PHP版本案例,几百个PHP版本随意切换 先去下载你需要的PHP版本,你可以上PHP官方下载,也可以到集成环境PHPWAMP的官网去下载,都可以,都能直接使用,下载后直接丢到软件里就可以使用。 首先我先去下载我想要的PHP版本,如下图,我随便选择其中一个版本,我选的是php7.0.13,当然你可以选择5.2或者5.3等其他版本,看你的需求,几百个PHP版本,随便你选。 自定义设置PHP版本案例,几百个PHP版本随意切换 下载完成后,添加一个自定义站点 自定义设置PHP版本案例,几百个PHP版本随意切换 然后右键该自定义站点,点击此处打开对应文件夹(自定义版本右键才能看到此选项) 自定义设置PHP版本案例,几百个PHP版本随意切换 然后把你下载的版本号文件丢进去,如下图 自定义设置PHP版本案例,几百个PHP版本随意切换 把版本号丢进去后,点此直接启动即可使用你定义的php版本!会自动配置(当然你也可以自主配置,是不会限制你的,配置随意你修改。) 自定义设置PHP版本案例,几百个PHP版本随意切换 启动后我们可以浏览了,右键你想要浏览的网站,点端口浏览,因为目前示范的是端口模式,域名模式的话,把主界面变成80端口,在站点管理绑定域名即可,具体域名模式的教程,可以百度搜索,网上都有的,我就不演示了,我只演示如何自定义版本就可以了。 自定义设置PHP版本案例,几百个PHP版本随意切换 这是启动后的效果,如下图,看到了我们最新定义的php7.0.13了,这就是PHP默认打开的模块,如红框显示,你可以一键开启其他常用模块 自定义设置PHP版本案例,几百个PHP版本随意切换 默认安装好所打开的只是官方默认开启的模块,如果想开启其他常用模块,可以右键该自定义站点,一键开启常用模块。 自定义设置PHP版本案例,几百个PHP版本随意切换 开启后,重启动apache 自定义设置PHP版本案例,几百个PHP版本随意切换 然后浏览,我们可以看到常用的模块都开启了,红色方框显示的内容比刚才多了一倍,当然不止图片上这么点,我只截图了一部分。 自定义设置PHP版本案例,几百个PHP版本随意切换 更多PHPWAMP绿色集成环境相关教程,大家可以点击软件上面的菜单查看。
服务器专用完整版PHP集成环境集成完全组件无阉割,适合服务器上使用的PHP集成环境) 【为什么要使用PHPWAMP集成环境,而不是其他集成环境呢?】 1、因为PHPWAMP解压即可使用,你甚至不需要安装VC运行库也可直接运行,而其他的集成环境都需要你额外去安装vc运行库,下载费时间,安装也费时间。 2、PHPWAMP默认集成的各个组件都是最新版本的,而且是完整版,所以更加适合在服务器上运行(其他集成环境通常用来测试的,集成的组件阉割过,体积小很多)当然PHPWAMP也很适合在本地测试,如果包括32位和64位、线程安全与非线程安全的PHP版本,共计700多个PHP版本随便你切换。 3、PHPWAMP可以同时运行各个不同版本的PHP网站,十分适合对比测试。多版本同时运行也适合在服务器上运行那些对php版本要求比较严格的PHP程序,可在服务器上同时运行不同php版本的网站程序。 4、关键这货还能一键去除域名后面的端口号,实现与Apache、Nginx、IIS等WEB服务器共存时,去掉域名后面的端口号。 5、兼容性很强,兼容XP系统、windows7、windows8、windows10也能完美兼容,在各windows服务器上兼容能力也很强。 6、phpwamp集成环境还能与其他任意环境共存,互不影响,端口号可视化修改,强制解除端口占用等。 7、拥有强制干掉一切环境阻碍,一键强制卸载任意php环境,瞬间轰掉阻碍(不会影响系统),简单粗暴,让你节省时间立刻完成网站配置。 8、切换PHP版本方便,还能自定义PHP版本,提供700个PHP版本随便你换,及时满足各种程序对不同版本的需求。 9、在phpMyAdmin官方网站,你可以看到phpMyAdmin的各个版本下载中都提示了不同版本所能兼容的PHP版本与数据库版本,而PHPWAMP自带的数据库管理工具phpMyAdmin经过特殊修改,能完美兼容任何PHP版本,无论你切换任意PHP版本,都能正常使用,不会像一些PHP环境那样,升级或者换个版本,phpMyAdmin就会出现问题。 10、PHPWAMP拥有自动定期重启动服务器,自动定期重启动apachemysql等服务的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值