实现Qt中文路径的码制转换
作者:王家华,刘会亮
来源:《电脑知识与技术》2011年第30
        摘要:该文论述了Qt和其Qstring类的存储编码方式,研究了在Qt开发的程序中打开包含中文字符路径下的文件的方法。按照上述方法对Qt开发的储层地质统计分析系统 GASOR”unicode字符转中文中打开工程文件的源代码进行了改造 ,成功实现了GASOR打开保存在中文路径下包含中文字符文件名的文件。
        关键词:Qt;统一码;UTF8;中文路径
        中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)30-7419-02
        The Research and Application of Qt Implementation in the Chinese Path
        WANG Jia-hua, LIU Hui-liang
        (School of Computer, Xi'an Shiyou University, Xi'an 710065, China)
        Abstract: Introduced the storage encoding Unicode in in Qt Qstring class, discussed the method in the Qt program open include Chinese characters in file path. To modified the GASOR software source codet that open the project file in accordance with the above method ,to achieve a successful of open the GASOR file that Chinese path contains Chinese character.
        Key words: Qt; Unicode; UTF8; Chinese path
        Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。它使用一次编写、随处编译的方式为开发跨平台的应用程序提供了一个标准的C++ 应用程序开发框架。
        Qt 在整个应用程序编程接口及其内部都是用统一码(Unicode)。软件开发人员可以在程序内部使用Qttr()函数把用户看的见得字符串都封装起来,并且使用Qt支持工具为所需的语言准备翻译文件即可。这样是Qt程序界面变成中文字符形式。
        Qt优良的跨平台,丰富的API函数,支持 2D/3D 图形渲染和大量的开发文档,因此,国内使用Qt 进行软件界面开发的软件公司越来越多。然而,Qt 开发的软件的界面和实际操作默认支持的是英文字符,国内软件用户习惯于使用汉字保存文件名和文件夹。如果不对Qt开发的软件源代码进行修改,那么用户在使用软件时,打开保存在中文路径下的含有中文字符文件名的文件时就会出错或者软件崩溃,因此寻求一种解决此问题的方法非常必要。通过手工对Qt程序的源代码中读取的文件的编码进行转换,使它可以识别和读取中文路径下的含有中文字符文件名的文件,这方便了软件操作人员的使用。
        1 统一码(Unicode)UTF8
        统一码(Unicode)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,统一码也在面世以来的十多年里得到普及。
        统一码用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8UTF-16UTF-32都是将数字转
换到程序数据的编码方案。
        UTF-8是统一码的一种变长字符编码又称万国码,由Ken Thompson1992年创建,它规定了字符在计算机中如何存储和传输。UTF-816个字节编码统一码字符。如果统一码字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果统一码字符由4个字节表示,则编码成UTF-8可能需要6个字节。UTF-8和统一码之间可以进行相互的转换。
        Qt中的Qstring类用于将字符串存储为统一码,这就使得无论用户接口是何种语言,应用程序都可以为所有的用户提供其语言支持。Qt内部采用的全统一码编码,这从根本上保证了多国语界面实现的正确性和便捷性。
        2 Qt识别中文路径和中文文件名的方法。
        Qt开发的软件在打开文件时的路径字符和文件名的默认方法支持的语言是英文, 如果按照此方法去打开中文路径下的中文名工程文件,那么读出来的是乱码或者软件直接崩溃。 这是因为没有把只识别英文字符的代码转换成可以识别中文字符的代码,程序在读取打开所需文件时不能到文件存储的位置和文件,其实质是字符编码的问题。
        2.1 识别汉字的预编译指令
        CC++ 一直以来对统一码没有提供任何直接的支持。目前来说,当我们提字符串时,一般是一个统一码字符串,其由一个一个的统一码字符构成;当我们提字节流时,是指一个一个的字节。ANSI CC++截止目前只有字节流,而缺乏对字符串的支持。Qt 为字符串提供了QString 类。当我们涉及到IO时,比如读写文件、读写网络socket、控制台(终端)输入输出、读写串口... 操作的都是字节流,如果我们此时需要的操作的内容是字符串,则需要二者之间的相互转换。QTextCodec 提供的就是字符串和字节流之间的相互转换(也就是字符的编解码)
        在程序中加入识别汉字的预编译指令:# include < Q tcore/QTextCodec>通过使用适当的QT extCodec来调用setCodec( ),还可以指定其编码方法。QTextCodec是一种可以在统一码和给定编码格式之间进行转换的对象, 用于指明源代码中出现的字符串的编码方式。
        2.2 Qt程序中的编码转换方法
        用中文,一般情况下就两种,GB(GB2312或者GBK)或者UTF-8两种。两种的解决方法
是相似的,这里我们以UTF-8为例说明。在打开工程文件的源代码文件开头处中加入以下几行语句进行编码的转换:
        QTextCodec *codec=QTextCodec::codecForName("UTF-8″);
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("codec"));
        //这个函数主要是用在字符常量或者QByteArray构造QString对象时使用的一种编码方式。
        QTextCodec::setCodecForTr(QTextCodec::codecForName("codec"));
        //这个函数的作用是设置传给tr函数时的默认字符串编码,GUI设计中最常用的一种。
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("codec"));
        //这个函数主要用于设置和对本地文件系统读写时候的默认编码格式。比如通过流读取一个文件内容时的编码格式。或者通过qDebug()输出打印信息时的编码。
       
        以上几行代码的功能实质是加入了一个编码转换器。在实际编程中仅仅加入以上几行代码是不行的,还需要对具体的读取文件路径和文件名的代码进行修改,以下通过一个具体例子进行说明。
        3 实例
        虽然C++标准中有了文件读取的相关类,也很好用,但是在涉及到Qt编程的时候却用起来不方便了,因为QT本身很多组件都是关联的自身的QString类型的字符串,所以需要把Qstring类转换成C++ string类。其实质就是把字符编码为统一码的编码方式转换为GBKUTF-8形式。以下是在GASOR中解决打开中文路径下含有中文字符文件名的工程文件所用的方法:
        void QSP_application::load_project() {
        GsTLcout
        QString start_dir = QString::null;
        QDirDialog* fd = new QDirDialog( ".prj", start_dir, this,"Load Project" );
        //创建打开工程对话框。
        fd->setWindowTitle(QObject::tr( "Load Project - select a directory") );
        //打开工程对话框名称
        if( fd->exec() == QDialog::Rejected ) return;
        QTextCodec* codec =QTextCodec::codecForName("UTF-8");
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
        QTextCodec::setCodecForLocale(codec);
        //以上几行代码功能是把QtUnicode编码转换为UTF-8形式
        QStringList L = fd->selectedFiles();
        QString dirname=QString(L[0]).toLocal8Bit();
        //把文件目录名dirname编码从Unicode形式转换为汉字的GBK编码形式
        QDir dialog_dir = fd->directory();
        QDir updir( dialog_dir );

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。