Qt5字符串编码转换学习

摘要:
一般来说,根据字符存储在计算机中的规则,例如“a”表示什么,称为“编码”;相反,存储在计算机中的二进制数被解析和显示,这被称为“解码”,就像密码学中的加密和解密一样。[1] 从上面的代码可以看出,编码是一种映射方法,将字符串转换为不同的二进制值。其中,gbk和utf8对应于char[-128128][0255];unicode对应于短[-3276832768][065535];;defdump_content_codings:printprintprintPrintpump-content_codiingsdump_contend_codingsdump-content_编码原始文本:aha123utf8:b'aha123'gbk:b'aha123'unicode:b'aha123'原始文本:ah123utf8:b'xe5x95x8axe5x93x88123'gbk:b'xb0xa1xb9xfe123'unicode:b'u554a u54c8123'2.Qt5使用QTextCodec进行编码转换。Qt使用Unicode来存储、绘制和操作字符串。Qt提供了一组QTextCodec类,以帮助在Unicode和非Unicode格式之间进行转换。

目录

1、通过Python3示例探索常用字符串编码

下面,我们通过Python3代码来了解一下字符串编码的小秘密:

首先,我们定义一个字符串aha123

aha123 = "啊哈123"

然后,我们看看它在各种编码下的二进制:

UTF8

aha123.encode('utf8')
b'xe5x95x8axe5x93x88123'

ANSI

aha123.encode('gbk')
b'xb0xa1xb9xfe123'

Unicode

aha123.encode('unicode_escape')
b'\u554a\u54c8123'

小结

计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。[1]

从上面的代码可以看出,编码是一种映射方式,它将字符串转换成了不同的二进制值,其中

  • gbk,utf8对应于(unsigned )char [-128,128] [0,255](f:string o uchar)
  • unicode对应于(unsigned )short[-32768,32768] [0,65535];;(f:string o ushort)
def dump_content_codings(content):
    print('原文   :',content)
    print('utf8   :', content.encode('utf8'))
    print('gbk    :', content.encode('gbk'))
    print('unicode:', content.encode('unicode_escape'))
dump_content_codings('aha123')
dump_content_codings(aha123)
原文   : aha123
utf8   : b'aha123'
gbk    : b'aha123'
unicode: b'aha123'

原文   : 啊哈123
utf8   : b'xe5x95x8axe5x93x88123'
gbk    : b'xb0xa1xb9xfe123'
unicode: b'\u554a\u54c8123'

2、Qt5中使用QTextCodec进行编码转换

Qt使用Unicode来存储、绘制和操作字符串。

Qt提供了一组QTextCodec类来帮助在Unicode和非Unicode格式之间进行转换。您还可以创建自己的编解码器类。[2]

void string_coding_test() {
    std::string aha_u8 = u8"啊哈123";
    QTextCodec* utf8_codec = QTextCodec::codecForName("UTF-8");
    QTextCodec* gbk_codec = QTextCodec::codecForName("GBK");

    // UTF8 -> Unicode,首先将utf8转换成内置的unicode(QString)
    QString aha_unicode = utf8_codec->toUnicode(aha_u8.c_str());

    // Unicode -> gbk,再从unicode转换成gbk
    std::string aha_gbk = gbk_codec->fromUnicode(aha_unicode);

    // 以下代码用于显示转换后的二制内容以及保存的文本文件内容
    for (auto& i : aha_gbk)
    {
        if ('0' <= i && i <= '9')
            std::cout << i;
        else
            std::cout << "\x" << std::hex << short(i);
    }
    std::cout << std::endl ;
    {
        std::string sPath = "text_gbk.txt";
        std::ofstream file(sPath);
        file << aha_gbk << std::endl;
    }

    // Unicode -> utf8,又从unicode转换成utf-8
    std::string aha_u8_2 = utf8_codec->fromUnicode(aha_unicode);

    // 以下代码用于显示转换后的二制内容以及保存的文本文件内容
    for (auto& i : aha_u8_2)
    {
        if ('0' <= i && i <= '9')
            std::cout << i;
        else
            std::cout << "\x" << std::hex << short(i);
    }
    {
        std::string sPath = "text_u8.txt";
        std::ofstream file(sPath);
        file << aha_u8 << std::endl;
    }
}

小结

在Qt5中,先将字符串保存为QString(Unicode),然后,再通过QTextCodec,将Unicode转换成其它编码的字符串。

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

上篇python并发编程之多线程2死锁与递归锁,信号量等yii2框架随笔35下篇

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

相关文章

搞懂js中小数运算精度问题原因及解决办法

js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型。 number类型不同进制 number 有四种进制表示方法,十进制,二进制,八进制和十六进制 表示方法 二进制: 0B或者0b (数字0和字母B或者小写字母b) ,后接...

HTML超链接中文乱码

Vm中一个超链接URL需要拼接中文作为Get请求的参数。如果直接拼接,传到后台Action的参数对象中后取出会是乱码,需要编码后再拼接到URL上。  解决方法是在Action中添加一个成员变量,保存编码后的中文参数。在vm页面渲染时取出这个变量值,再拼接超链接。 在这里碰到的问题是:调用java.net.URLEncoder的encode()方法时,如...

搜狐微博的解码方式及常用字符集一些知识.

开通了一个月,还没发一篇文章,今天将最近学到的知识做个总结,发表一下,如有错误请各路大神指正,不喜勿喷!!! 搜狐微博msg走的流程(全中文,中英文混合):1、将unicode形式的内容转化成GB18030形式的内容2、将GB18030形式的内容进行utf-8解码 msg走的流程(纯英文):直接进行url解码 普通微博msg走的流程(所有类型):直接进行u...

Python中读取txt文本出现“ 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence”的解决办法

UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence 今天练习通过读取英文版的Walden.txt的文本信息,统计文本中的英文单词词频的时候出现了这样的错误提示。 错误的意思是:Unicode的解码(Decode)出现...

骨牌覆盖问题 KxM

 前面我们说了一些简单的骨牌覆盖问题,有了上面的经验,我们可以尝试解决K*M的 思路和上一篇文章所提到的3*N的 很类似; 依然是矩阵快速幂。我们需要把一个小的边固定下来作为的已知边,然后进行矩阵快速幂,要进行矩阵快速幂,我们需要知道初始矩阵,与构造出的递推矩阵; 我们如何得到这两个矩阵? 初始矩阵:矩阵宽度为 2^n  次方;第一排只可能出现,0或者横...

php中浮点数计算问题

最近做一个关于价格的程序时,碰到了一个很奇怪的问题。我把问题给抓出来了。请看如下代码: <?php$a = 86.1 - 80.0;echo 6.1 - $a;?>   你会发现,echo出来的结果居然不是0,而是5.3290705182E-15。思索了半天,也没找到是什么原因。用了C语言试了一下,结果正常。同事说他以前也遇到过,估计是超出了P...