QT中文乱码的解决

Blog Transferred to: http://www.kanhua.org 


ubuntu下加如下两句就好了(第一句不是必须的)

QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
       QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));

QT国际化支持

Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性。Qt本身提供的linguist工具,用来实现翻译过程十分方便。MFC中利用资源DLL切换资源,或使用多个RC文件进行不同语言版本编译等方法都十分麻烦,如果你曾经使用过MFC,QT解决多语言问题的便捷性绝对会让你感觉是一种享受。本文讨论以下几个方面内容:

1、 QT中解决中文乱码的方法;

2、 QT中实现国家化支持。

3、 对话框实现多语言

一、 中文乱码

1、 在程序中直接使用中文,需要在程序中加入以下代码:


view plaincopy to clipboardprint?
#include <QTextCodec>

int main(int argc, char **argv)
{
QApplication app(argc, argv);
QTextCodec *codec = QTextCodec::codecForName("GB2312");

QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);

…… ……
return app.exec();
}



这样在程序中使用tr(“中文”)或者直接使用“中文”了;

2、 解决读取ini文件中中文乱码

QSettings settings("xxxx.ini",QSettings::IniFormat);

settings.setIniCodec(QTextCodec::codecForName("GB2312")); settings.beginGroup("company");

3、 解决读取中文文件中文的乱码


view plaincopy to clipboardprint?
QFile file("xxxx.txt");
QTextStream stream(file,QIODevice::ReadOnly);
stream.setCodeC( QTextCodec::codecForName("GB2312") );
stream.readAll();







二、 国际化支持

QT中实现多国语言,建议在程序中直接英文,而后通过不同的翻译文件实现多语言的支持。实现多国语的步骤有如下几步(提及的工具均为QT自带):

Ø 在需要被翻译的字符串前面加标识tr,如QString str = tr(“hello,world!”); 这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是加上tr的了,所以在翻译时也能看见。

Ø 在QT工程文件*.pro中增加一项:TRANSLATIONS += *.ts,扩展名为.ts是翻译的源文件。一般会在命名中把区域加进去,更好的注释这些文件是用于什么语言的,可以根据“语言_国家”的形式形成文件名。比如中命名为myapp_zh_CN.ts, zh表示简体中文,而CN表示的就是中华人名共和国。可以参照ISO语言与国家代码标准:http://blog.csdn.net/alicehyxx/archive/2009/12/06/4952318.aspx

Ø 使用lupdate工具提取翻译源文件,【运行】中输入CMD,打开命令行窗口,利用CD命令切换到QT安装目录的BIN目录中,而后输入:

lupdate *.pro

*.pro包含pro文件的全路径。lupdate会解析*.pro文件,生成TRANSLATIONS中的 *.ts 文件,这些文件可以被linguist工具打开,按照提示一个一个的翻译成需要的文件并保存。

Ø 重复以上两步!
(针对以上两步,VS2005中可以直接使用菜单【QT】à 【Create new translations File】创建,如果文件已经存在,可以通过图1.1菜单进行更新。)



图1.1 VS2005_lupdate

Ø 使用lrelease工具发布翻译文件的二进制文件,这样在程序运行时载入会大大的加快速度。在命令行窗口中继续输入:

lrelease *.ts

*.ts包含ts文件的全路径。这个工具会提示你多少语句被翻译,多少被忽略了等。生成的文件是*.qm,与同名的 *.ts只是换了一个扩展名。这个就是我们程序需要使用到的文件。

(VS2005中可以使用图1.1中的菜单lrelease来实现该步骤)

Ø 使用*.qm文件。程序可以通过两种方式加载翻译文件,一种硬编码方式,直接指定加载的语言,代码如下:

int main(int argc,char* argv[])

{

QApplication app(arcg,argv);

QTranslator translator;

translator.load(“basicdraw_zh_CN”);

app.installTranslator(&translator);

}

另外一种是自动判断翻译当前的locale,再装入相应的翻译文件,如下所示:

int main(int argc,char* argv[])

{

QApplication app(arcg,argv);

QString locale = QLocale::system().name();

QTranslator translator;

translator.load(QString(“basicdraw_”) + locale);

app.installTranslator(&translator);

}

其中QLocale::system().name()返回以“语言_国家”形式形成的字符串,比如zh_CN。

至于通过控件,比如ComboBox选择语言,并实现动态切换,以后再讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值