zoukankan      html  css  js  c++  java
  • Qt 字符编码转换(UTF-8 转换为 GBK)

    字符串编码格式转换

    很多时候可能需要字符串编码的转换,最近我需要获取一段字符串的长度,我strlen() 获取的’你好’ 的字节长度为6 ,我记得每个汉字占用2字节 ,查了一下 UTF-8格式 汉字(含繁体)占3字节,需要转下码.

    编码知识

    Qt常见的两种编码是:UTF-8和GBK
    UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

    GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。GBK是GB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。

    GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
    GBK、GB2312--Unicode--UTF8
    UTF8--Unicode--GBK、GB2312
    在简体中文windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使用0x80~0xFF范围的2个字节来表示1个中文字符。0x00~0x7F之间的字符,依旧是1个字节代表1个字符。Unicode(UTF-16)编码则所有字符都用2个字节表示。
    上面说了 GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换 但是我试了下 utf-8 可以直接转换为 gbk

    Qt中 提供了 一个字符串转码的类 QTextCodec

    QTextCodec类提供文本编码之间的转换。
    Qt使用Unicode存储、绘制和操作字符串。在许多情况下,您可能希望处理使用不同编码的数据。例如,大多数日本文档仍然存储在Shift-JIS或ISO 2022-JP格式,而俄罗斯用户的文档通常存储在KOI8-R或windows 1251格式。
    Qt提供了一组QTextCodec类,以帮助将非Unicode格式转换为Unicode格式。您还可以创建自己的编解码器类。
    支持的编码是:

    Big5
    Big5-HKSCS
    CP949
    EUC-JP
    EUC-KR
    GB18030
    HP-ROMAN8
    IBM 850
    IBM 866
    IBM 874
    ISO 2022-JP
    ISO 8859-1 to 10
    ISO 8859-13 to 16
    Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
    KOI8-R
    KOI8-U
    Macintosh
    Shift-JIS
    TIS-620
    TSCII
    UTF-8
    UTF-16
    UTF-16BE
    UTF-16LE
    UTF-32
    UTF-32BE
    UTF-32LE
    Windows-1250 to 1258

    我用到的就很简单 utf-8 转为 gbk
    如果你原本编码不是 utf-8 就要先转换 utf-8 这里我们假设 原本编码也不是utf-8

    #include <QTextCodec>
    
        QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");  
    
        QTextCodec::setCodecForLocale(utf8);
    
        QTextCodec* gbk = QTextCodec::codecForName("gbk");
    
        QString str1="您好";
    
        //utf8 -> gbk
    
        //1. utf8 -> unicode
    
        QString strUnicode= utf8->toUnicode(str1.toLocal8Bit().data());
    
        //2. unicode -> gbk, 得到QByteArray
    
        QByteArray gb_bytes= gbk->fromUnicode(strUnicode);
    
    
        //gbk -> utf8
    
        //1. gbk to unicode
        strUnicode=gbk->toUnicode(str1.toLocal8Bit().data());
        //2. unicode -> utf-8
        QByteArray utf8_bytes=utf8->fromUnicode(strUnicode);
    

    格式转换为 gbk 以后 汉字就是2字节了,搞定

    参考:https://blog.csdn.net/weixin_42837024/article/details/81630720

       https://www.cnblogs.com/CodeSkill/p/5082447.html

       https://www.cnblogs.com/lvdongjie/p/11821318.html

       https://blog.csdn.net/qq_35905572/article/details/95042444

       https://www.cnblogs.com/sggggr/p/12797951.html

       https://blog.csdn.net/xyyangkun/article/details/7382823

       http://blog.sina.com.cn/s/blog_aec26f5801015erv.html

  • 相关阅读:
    捕获mssqlservice 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据
    有关求第n位xxx 的算法的问题
    C#获取枚举的特性描述工具方法
    wpf中嵌入另一个子进程exe像本地的一个页面那样
    emit 实现动态类,动态实现接口
    EF 支持泛型动态加载类访问数据库
    C# 通过 参数返回 C++ 指针
    C# 接收C++ dll 可变长字节或者 字符指针 char*
    健身篇
    Ubuntu 16.04安装Docker-Compose 与 Can't connect to docker from docker-compose
  • 原文地址:https://www.cnblogs.com/Malphite/p/15028144.html
Copyright © 2011-2022 走看看