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

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

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

aha123 = "啊哈123"

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

UTF8

aha123.encode('utf8')
b'\xe5\x95\x8a\xe5\x93\x88123'

ANSI

aha123.encode('gbk')
b'\xb0\xa1\xb9\xfe123'

Unicode

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

小结

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

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

  • gbk,utf8对应于(unsigned )char [-128,128] [0,255];\(f:string \to uchar\)
  • unicode对应于(unsigned )short[-32768,32768] [0,65535];;\(f:string \to 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'\xe5\x95\x8a\xe5\x93\x88123'
gbk : b'\xb0\xa1\xb9\xfe123'
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字符串编码转换学习的更多相关文章

  1. 完整的java字符串编码转换代码

    package book.String; import java.io.UnsupportedEncodingException; /** *//** * 转换字符串的编码 * @author joe ...

  2. JAVA字符串编码转换常用类

    无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312.一.关键技术点:    ...

  3. java字符串应用之字符串编码转换

    [转载]原文地址:https://blog.csdn.net/zhouyong80/article/details/1900100 无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其 ...

  4. loadrunner 脚本开发-字符串编码转换

    字符串编码转换 by:授客 QQ:1033553122   相关函数 lr_convert_string_encoding函数 功能:字符串编码转换 原型: int lr_convert_string ...

  5. JAVA 字符串编码转换

    /** * 字符串编码转换的实现方法 * @param str 待转换编码的字符串 * @param newCharset 目标编码 * @return * @throws UnsupportedEn ...

  6. java中字符串编码转换

    Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...

  7. js 字符串编码转换函数

    escape 方法 对 String 对象编码以便它们能在所有计算机上可读, escape(charString) 必选项 charstring 参数是要编码的任意 String 对象或文字. 说明 ...

  8. python中字符串编码转换

    字符串编码转换程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的. 其实编码问题很好搞定,只要记住一点: 任何平台的任何编码,都能和Unicode互相转换. UTF-8与GBK互相转换,那就先把U ...

  9. PHP --字符串编码转换(自动识别原编码)

    /** * 对数据进行编码转换 * @param array/string $data 数组 * @param string $output 转换后的编码 */ function array_icon ...

随机推荐

  1. 4G DTU是什么?

    要从任何设备(个人计算机.平板电脑或智能手机)访问Internet,需要DTU或热点.大多数宽带和移动DTU在"4G"或第四代网络系统上运行.虽然互联网连接的许多基本原则与4G D ...

  2. python实现城市气候与海洋的关系研究

    城市气候与海洋的关系研究 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 后打开浏览器输入网址http:// ...

  3. numpy数组运算

    一.四则运算   (以此为例) 1.加法 2.减法 3.乘法 4.除法 5.幂运算 二.比较运算   (以此为例) 1.<   > 2.>=    <= 3.==    != ...

  4. 写时复制集合 —— CopyOnWriteArrayList

    前言 JUC 下面还有一个系列的类,都是 CopyOnWriteXXX ,意思是写时复制,这个究竟是怎么回事?那就以 CopyOnWriteArrayList 为切入点,一起了解写时复制是怎么回事? ...

  5. c#写入文件流

    using (FileStream wir=new FileStream(@"C:\Documents and Settings\Administrator\桌面\1.txt",F ...

  6. 小学生学习C++应该具备哪些基础?

    一.电脑操作基础: 应该具备一些必要的电脑相关的知识,如操作系统的相关知识,如何打开.编辑.保存文件.对电脑的能力有一些基本的认识,以及会使用鼠标,键盘熟练输入. 磨刀不误砍柴工,至少要做到能快速找到 ...

  7. javascript-闭包【面试必备】

    闭包 定义:内层函数可以访问外层函数作用域的变量 意义/用途: 1.封装细节 2.实现模块化 3.常用实战li列表 // querySelectorAll es5支持的一个类似于jq的复杂选择器选取d ...

  8. Java8 新特性 —— 函数式编程

    本文部分摘录自 On Java 8 概述 通常,传递给方法的数据不同,结果也不同.同样的,如果我们希望方法被调用时的行为不同,该怎么做呢?结论是:只要能将代码传递给方法,那么就可以控制方法的行为. 说 ...

  9. create event[]

    一.前言自 MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录.对数据进行汇总等等),来取代原先只能由操作系 ...

  10. fashion数据集训练

    下载数据集 fashion数据集总共有7万张28*28像素点的灰度图片和标签,涵盖十个分类:T恤.裤子.套头衫.连衣裙.外套.凉鞋.衬衫.运动鞋.包.靴子. 其中6万张用于训练,1万张用于测试. im ...