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. nacos 作为配置中心使用心得--配置使用

    1.页面配置 撇开原理不谈,先来介绍下nacos的基本使用,如下图nacos配置是以data id为单位进行使用的,基本上一个服务的一个配置文件就对应一个data id,支持的格式有xml,yaml, ...

  2. 探索G1垃圾回收器

    前言 最近王子因为个人原因有些忙碌,导致文章更新比较慢,希望大家理解,之后也会持续和小伙伴们一起共同分享技术干货. 上篇JVM的文章中我们对ParNew和CMS垃圾回收器已经有了一个比较透彻的认识,感 ...

  3. Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法

    一.报错含义: val=9 def test(): print(val) val = 6 print(val) test() 翻译:本地变量xxx引用前没有定义. 二.报错原因 这是Python变量作 ...

  4. dat.GUI 打造可视化工具(一)

    前言 有时候学习api其实我们可以从源码的角度学习,因为有时候很多文档写的太不清楚了,自己都是慢慢去试,去猜,去实现其实也是挺浪费时间的,面对未知的一脸蒙蔽,偶尔烦躁,其实需要的是自己静下心来慢慢研究 ...

  5. Redux学习day1

    01.React介绍 Redux是一个用来管理管理数据状态和UI状态的JavaScript应用工具.随着JavaScript单页应用(SPA)开发日趋复杂,JavaScript需要管理比任何时候都要多 ...

  6. MYSQL的添加字段和修改字段

    ALTER TABLE 表名 ADD 字段名 字段类型 //添加字段 DESC 表名 //获取表的结构 SHOW COLUMNS FROM 表名 //也是获取表的结构 DESCRIBE 表名 //获取 ...

  7. C# 全局唯一标识符 (GUID)

    一 C#  全局唯一标识符 (GUID) Represents a globally unique identifier (GUID). To browse the .NET Framework so ...

  8. 用npm安装插件时报错: fsevents@^1.0.0 (node_modules\chokidar\node_modules\fsevents)

    在做前端项目的时候执行命令: npm install --save-dev file-loader@1.1.6 --registry=https://registry.npm.taobao.org 出 ...

  9. mysql between and 是[a,b]闭区间

    mysql between and 是[a,b]闭区间 mysql between and 是[a,b]闭区间

  10. 都知道的copy_from_user

    Q:一直知道内核和用户态的数据交互前都需要 校验地址的合法性,一般都用copy_from/to_user完成数据拷贝,那么为什么要这样呢?? A:看了一些blog以及Stack Overflow 主要 ...