免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1275 | 回复: 0
打印 上一主题 下一主题

zz Qt 编码的问题思考 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-14 10:28 |只看该作者 |倒序浏览
以前很少转载,现在看来不现实,尽量少转载吧。
前些日子,被编码折磨了一段时间,总结一下Qt中的编码。
【Qt 编码简单实验】
首先,Qt中得QString
类对字符串进行了封装,其内部使用Unicode对传入的串进行编码。这样一来,QString就可以处理绝大多数的国际语言。将QString中的字符
根据语言翻译的过程,也就是Qt
的Translater针对程序中使用含有的tr("XXXXX"),进行翻译的过程。由于QString的Unicode编码,和本地系统的编码不一定
是一致的(比如系统采用的GB2312的编码)。这样的话,就不能直接使用类似QString
str("汉字")这样的方法来存储本地的汉字,是有问题的。
   
    【试验1】
       QString str("汉字");
       std::cout setFont(font1);
        7. QTranslator *translator = new QTranslator(0);
        8. translator->load("xxx.qm",".");
        9. qApp->installTranslator(translator);
方法二:
        1. findtr 文件名(通常为CPP文件) > xxx.po
        2. 编辑po文件,其中charset需由iso-8859-1改为GB2312,然后将“main window”翻译成“主窗口”
        3. msg2qm –scope zh_CN.GB2312 xxx.po xxx.qm
        4. 在main.cpp中加入QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);
        5. qApp->setFont(font1);
        6. QTranslator *translator = new QTranslator(0);
        7. translator->load("xxx.qm",".");
        8. qApp->installTranslator(translator);
方法三:
     有时我们只是提供给本地用户使用,无需国际化,QT提供这一支持,在QT中有许多本地字符集同unicode的转换引擎,他们皆为QTextCodec的派生类,如QGbkCodec、QJisCodec, QHebrewCodec等。如:
        QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);
        qApp->setFont(font1);
        QString caption=“主窗口“;
        QTextCodec *gk_codec=QTextCodec::codecForName(“GBK”);
        setCaption(gk_codec->toUnicode(caption));  
       从上面可以看出,使用转换引擎可以轻松实现中文显示,简要步骤如下:
       1. 修改main.cpp文件,将字体改为unifont
              QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);
              qApp->setFont(font1);
       2. 在想汉化的内的头文件中加入QTextCodec指针变量和转换函数QString mytr(char *)
       #include
       QTextCodec* gbk;
       QString mytr(const char *);
       3. 在想汉化的类的实现文件中,修改类构造函数,加入:
              gbk=QTextCodec::codecForName(“GBK”);
       4. 在想汉化的类的实现文件中,添加mytr函数代码
              QString Form1::mytr(const char* chars) {
               return gbk->toUnicode(chars,strlen(chars));
              }
       5. 在想汉化的类的实现文件中,用“mytr”替换“tr”
     注:如果将codec成员变量改成QTextCodec派生类变量,编译将通不过,比如将QTextCodec* gbk;改成QGbkCodec* gbk;编译将报告此处有语法错误。
下面是相似的用法:
        1. 修改***.cpp文件,在顶部加入codec头文件
                 #include
        2. 在***.h文件中,加入mytr()函数声明
                 QString mytr(char* buffer,int size);
        3. 在***.cpp文件中,加入mytr()定义
                 QString mytr(char* buffer,int size) {
                     QGbkCodec* gbk=QTextCodec::codeForName(“GBK”);
                     return gbk->toUnicode(buffer,size);
                  }
        4. 在需要显示中文的地方,使用mytr函数即可
        5. 修改main.cpp文件,将字体改为unifont
                     QFont font1(“unifont”,16,50,FALSE,QFont::Unicode);
                     qApp->setFont(font1);
    备注1:在翻译或转换之前必须将Unicode字体调入,否则显示不出中文,网上相关文章并未提及这一点,如果不显式装载该字体,系统默认的是Latin1,于是汉字显不出来。  
    备注2:在编译qt/embedded之前,必须修改qconfig-qpe.h配置文件的内容,将与TextCodec相关的宏定义给去掉,否则QTextCodec::codecForName(“GBK”)将返回NULL指针。
    备注3:使用findtr命令时可同时查找多个文件的tr(),并将查找结果都放入一个文件内,源文件以空格隔开即可,另外,生成的.po和.qm文件的文件名最好与工程文件名相同!  
备注4:如果要显示繁体中文,则需要使用QTextCodec::codecForName(“big5”)。获取本地的使用语言,用
QTextCodec::locale(),它返回Qstring变量,通常如果是中文本地的话,通常其值为zh_CN.GB2312和
zh_TW.Big5,根据这个返回字符串,可以加载相应的codec。如果程序只支持一种编码,也可以直接把整个应用程序的编码设置为一个默认的编码标
准,比如系统只需要显示中文和英文,则可以直接设置应用程序的默认编码标准是GBK,如下使用方法:
       qApp->setDefaultCodec( QTextCodec::codecForName("GBK") );
       QLabel *label = new QLabel( tr("中文标签") );
     备注5:如果使用本地的字符转换器,可以使用Qstring的静态函数Qstring::fromLocal8Bit(char* buffer,int size),将本地字符串转换成UNICODE字符串,不过要设置好LANGUAGE环境变量。
【QTOpia中文化 】
1) findtr 文件名 > xxx.po
2) 编辑xxx.po文件
3) msg2qm –scope zh_CN.GB2312 xxx.po xxx.qm
4) 拷贝可执行文件到QPEDIR/bin目录
5) 拷贝xxx.po和xxx.qm文件到QPEDIR/i18n/zh_CN目录
6) 进入QPEDIR/apps/Applications目录创建一新.desktop文件
7) iconv –f utf8 –t GB18030 xxx.desktop > xxx1.desktop
8) 编辑xxx1.desktop文件,主要是修改Exec、Icon、Name和Name[zh_CN]四项
9)  iconv –f GB18030 –t utf8 xxx1.desktop > xxx.desktop
10) rm –f  xxx1.desktop
11) qvfb –depth 16 &
12) cd $QPEDIR/bin
13) ./qpe  
     备注1:如果你的系统中有多个qtopia版本,要特别注意QTDIR、QPEDIR、LD_LIBRARY_PATH环境变量
     备注2:可按照此方法汉化qtopia自带的应用程序
备注3:po文件是中间文件,程序真正需要的是qm文件。iconv是系统自带的内码转换工具,它能将utf8编码的文件转换成gb18030编码的文
件,反之也能,转换这一步必不可少,因为desktop文件缺省是utf8编码的,而我们的redhat linux
7。3中文操作系统用的却是gb18030,所以在编辑器打开前需转换。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93262/showart_1995406.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP