33.QT-UTF8,GBK互转

首先需要用到QString的静态成员函数来获取字符数组:

QByteArray QString::toLocal8Bit () ;
                        //获取字节数组对象
char * QByteArray::data ();        //通过字节数组对象的成员data函数,获取char数组

QTextCodec编码类介绍

互转主要用到这个类,通过该类可以获取编码对象,其中常见支持:

  • UTF-8
  • UTF-16  //默认大端
  • UTF-16BE   //大端,大数据开头, 比如字符a=00 61
  • UTF-16LE   //小端,小数据开头, 比如字符a=61 00
  • UTF-32
  • UTF-32BE             
  • UTF-32LE      
  • GB2312
  • GBK等

比如获取utf-8编码对象:

QTextCodec *utf8 = QTextCodec::codecForName("UTF-8"); //获取UTF-8编码对象

示例-utf8转为GBK

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));    //设置本地编码对象
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));  //设置QString编码对象

     //utf8向gdk转换的过程是utf8->unicode, unicode->gdk
     //在PC,Unicode一般代表utf-16,而utf-8是单独列出来的
     //啊的gbk编码: 0xB0A1            啊的utf8编码:0xE5958A
     //哈的gbk编码: 0xB9FE            哈的utf8编码:0xE59388

    char encode[6]={0xe5,0x95,0x8A,0xE5,0x93,0x88};             //啊哈 utf-8编码
    QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");       //获取UTF-8编码对象
    QString  unicode = utf8->toUnicode(encode,6);               //通过UTF-8编码对象将啊哈转为utf-16

    QTextCodec *gbk = QTextCodec::codecForName("GBK");          //获取GBK编码对象
    QByteArray arr=gbk->fromUnicode(unicode);                   //从Unicode编码转为自身编码类型(GBK)
    qDebug()<<QString::fromLocal8Bit(arr);                     //打印GBK码

    qDebug()<<arr.size();
    for(int i=0; i <arr.size();i++)
    {
        qDebug("%x",(unsigned char)arr[i]);
    }

打印:

示例-GBK转为UTF8

 QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));    //设置本地编码对象
 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));  //设置QString编码对象


     //啊的gbk编码: 0xB0A1            啊的utf8编码:0xE5958A
     //哈的gbk编码: 0xB9FE            哈的utf8编码:0xE59388

     QString str="啊哈";               //对应编码为:  0xB0A1  0xB9FE

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

     QString unicode=gbk->toUnicode(str.toLocal8Bit());    //通过gbk编码对象将啊哈转为utf-16


     QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");

     QByteArray arr=utf8->fromUnicode(unicode);           //从Unicode编码转为自身编码类型(utf-8)

     qDebug()<<arr.size();
     for(int i=0; i <arr.size();i++)
     {
         qDebug("%x",(unsigned char)arr[i]);
     }

 打印:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

Python3 与 C# 基础语法对比(List、Tuple、Dict专栏)

Python3 与 C# 基础语法对比(基础知识场):https://www.cnblogs.com/dotnetcrazy/p/9102030.html

253100
来自专栏PHP实战技术

PHP常用正则表达式大全

  匹配数字   "^\d+$" //非负整数(正整数 + 0)   "^[0-9]*[1-9][0-9]*$" //正整数   "^((-\d+)|(0+))...

57280
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(List、Tuple、Dict专栏)

Python3 与 C# 基础语法对比(基础知识场):https://www.cnblogs.com/dotnetcrazy/p/9102030.html

9830
来自专栏项勇

笔记10 | 学习整理静态static 和 终态final

14150
来自专栏编程

使用dict和set

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。-...

235100
来自专栏Golang语言社区

【Go 语言社区】Go学习笔记:json处理

Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interfac...

715120
来自专栏拂晓风起

java 字符串编码转换 字符集/编码的见解 心得 体会(跟之前那个C++编码随笔对应)

20230
来自专栏LIN_ZONE

java反射机制的简单使用

通过上面的代码可以获得 运行时类的对象,然后下面使用运行时类的对象来构造一个反射工具类,通过下面这个类 可以利用反射机制实例化该类的对象,设置对象的属性并调用对...

9720
来自专栏Ldpe2G的个人博客

Scala typeclass 设计模式

本文的写作的灵感主要是看了这个视频 : Tutorial: Typeclasses in Scala with Dan Rosen

16860
来自专栏绿巨人专栏

[Java] 设计模式: Code Shape - 管理你的代码结构

10220

扫码关注云+社区

领取腾讯云代金券