Qt 编码问题QTextCodec

摘要:
类似地,在Linux开发环境中,一般的编写方法是:QTextCodec*utg8=QTextCodec::codecForName;QTextCodec::setCodecForTr;QTextCodec::setCodecForLocale;QTextCodec::setCodecForCStrings;通常,函数setCodecForTr()是GUI设计中最常用的函数。可以根据您使用的区域设置其他功能。但是,为了实现通用编码,以免忘记编码格式并使自己头疼,建议统一设置这三个函数,以避免出现中文乱码的可能性。现在我们来谈谈编码转换。QT中QString的内容使用Unicode作为文本编码。

在学习计算机语言的时候, 关于字体编码问题, 一直是大家开始学习新语言比较头痛的问题,

在这边总结一下关于Qt图形框架开发的编码问题。

  一般在Window开发环境里,是GBK编码,在Linux开发环境里,是utf-8编码,关于编码的定义, 我就不这里多说了,网上有一大堆资料可以查看。

   qt对默认的是unicode编码,在Window开发环境里,比较通用的写法是: 在main.cpp文件中加入:

  

    1. QTextCodec *gbk = QTextCodec::codecForName("gb18030"); 

    2. QTextCodec::setCodecForTr(gbk);
    3. QTextCodec::setCodecForLocale(gbk);
    4. QTextCodec::setCodecForCStrings(gbk);

第一行:定义gb18030编码格式

第二行: 这个函数的作用是设置传给tr函数时的默认字符串编码,GUI设计中最常用的一种。

第三行:这个函数主要用于设置和对本地文件系统读写时候的默认编码格式。比如通过流读取一个文件内容时的编码格式。或者通过qDebug()输出打印信息时的编码。

第四行:这个函数主要是用在字符常量或者QByteArray构造QString对象时使用的一种编码方式。

同理,在Linux开发环境里, 通用的写法是:


    QTextCodec *utg8 = QTextCodec::codecForName("utf-8");

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

一般我们做GUI设计的时候, 用到最多的也就是setCodecForTr()这个函数了,其他可以根据自己所用到的区域在设置,不过,为了通用编码,以便忘记了编码格式而弄的自己头痛, 建议还是把这三个统一设置一下吧,尽量避免中文乱码出现的概率。

下面讲一下关于编码转换问题

QT中的QString内容使用Unicode作为文本编码。但是实际系统中通常采用的是其他编码,例如GBK,utf8等。为了便于兼容这些格式,QT中还设置了两个字符串类型:

QCString类: C类型字符串,必须以0结尾,也就是中间不能含有0. 例如GBK编码的字符串

QByteArray类: 中间可以含有0.例如utf8编码的字符串

在设置下面的代码基础上:

     QTextCodec *gbk = QTextCodec::codecForName("gb18030"); 

    QTextCodec *utg8 = QTextCodec::codecForName("utf-8");

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

1. UTF-8 转换 GBK

QString U2G(QString utfStr)

{

       return gbk->toUnicode(utfStr.toLocal8Bit());

}

2 GBK 转换 UTF-8

QString U2G(QString gbkStr)

{

       return utg8->toUnicode(gbkStr.toUtf8());

}

-----------------------------------------------------------------------------------

    QTextCodec *gbk = QTextCodec::codecForName("gb18030");
    QTextCodec *utf8 = QTextCodec::codecForName("utf-8");

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


    QFile file("../test.txt");
    file.open(QIODevice::ReadOnly);
    QByteArray readByte = file.readAll();
    QString readStr = utf8->toUnicode(readByte.data());
    file.close();
    QString utfStr = QObject::trUtf8(readByte);    //utf-8
    QString gbkStr = QObject::tr("中文");          // gbk


    QString utf2gbk = gbk->toUnicode(readStr.toLocal8Bit());             // utf8 conver  gbk
    QString gbk2utf1 = utf8->toUnicode(utf2gbk.toUtf8());                 // gbk  convert utf8
    QString g2u = gbk->toUnicode(gbk->fromUnicode(readStr));            // gbk  convert utf8


    qDebug() << "gbk:" << gbkStr;
    qDebug() << "utf8:" << utfStr;
    qDebug() << "readStr:" << readStr;

    qDebug() << "read_size:" << readByte.length();
    qDebug() << "utf2gbk:" <<utf2gbk << "length:" << readStr.toLocal8Bit().length();
    qDebug() << "gbk2utf8-1:" << gbk2utf1 << " length: " << utf2gbk.toUtf8().length();
    qDebug() << "g2u" << g2u << "length:" << gbk->fromUnicode(utfStr).length();


    QLabel *label = new QLabel(utf2gbk);
    label->show();

--------------------------------------------------------------------------------------------------------------

免责声明:文章转载自《Qt 编码问题QTextCodec》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RMAN详细教程(一):基本命令代码MySQL命令简介下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Microsoft SQL Server 2000 的国际化功能(1)

简介 Microsoft? SQL Server? 2000 包括各种支持国际化操作和环境的强大功能。扩展的多种语言功能使 SQL Server 2000 成为一种引人注目的数据库产品和应用程序平台。本文将完整地概述在全球范围内使用这些功能的方法。 除了列出一系列功能外,本文还将解释国际化/多种语言要求会怎样影响项目的各个方面。 什么是...

Servlet第三篇【request和response简介、response的常见应用】

response、request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的response对象 既然request对象代表http请求,那么我们获取浏览器提交过来的数据,找request对象即可。response对象代表http响应,那么我们向浏览器输出数据,找response对象...

python字符编码、字符串格式化、字符串方法、列表、元组、字典、集合等基础知识总结

目录: 一、字符编码 二、字符串格式化 三、进制转换 四、数据类型及其操作 1.int类、2.str类 五、格式转换 六、For循环 七、三元运算 八.列表 九、列表推导式 十、元组 十一、字典 十二、集合set 十三、文件操作 十四、变量指向和深浅拷贝 一.字符编码: 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数...

ubuntu16.4下使用QT修改系统时间

我也是在网上找的,自己随便改了一下六个lineEdit控件,每个控件输入日期时间,点击按钮触发函数可修改时间。 1 //一键修改系统时间 2 QString year = ui->lineEdit_9->text(); //年 3 QString month = ui->lineEdit_10->tex...

《C++ Qt设计模式》 第一章 C++ 简介

第1 章 C++简介 内容: 编译相关     Qt提供了一个qmake工具,它会产生Makefile 文件。使用qmake -project 命令产生一个简单的工程文件。当执行这个命令时,qmake 会将当前工作目录下的全部源文件作为SOURCES列出来,而将全部头文件作为HEADERS 列出来     使用make 重新编译那些发生了变化的文件,或...

JSP中字符编码转换问题

问题描述:一个input.jsp页面中的参数,传递到另外一个save.jsp页面上,然后存入到数据库中,如果input.jsp页面输入偶数中文没有问题,输入奇数则出现?,存入数据库的也是?。 问题源码:save.jsp中 <%    String fileName=request.getParameter("Name");           Sys...