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. python中的类方法,实例方法和静态方法的区别

    类方法是类的方法,在定义的时候要在上方加上一个@classmethod装饰器来进行装饰,形参是cls,类和实例都可以取调用类方法: 实例方法是实例对象方法,只有实例可以调用,类是不能调用的,形参是se ...

  2. NB-IoT成为3GPP后会有哪些优势

    NB-IoT无线接入的设计使用了很多LTE设计大的原则,并且得到了传统蜂窝网络和芯片组供应商的支持,使MBB取得了成功.NB-IoT采用与LTE(E-UTRA)相同的设计原则,尽管它使用单独的新载波, ...

  3. nginx反向代理三台web服务器,实现负载均衡

    修改nginx.conf #在http和server之间加入这个模块 upstream guaji{ server 127.0.0.1:8080; server 127.0.0.2:8080; ser ...

  4. 使用java动态字节码技术简单实现arthas的trace功能。

    参考资料 ASM 系列详细教程 编译时,找不到asm依赖 用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具. 不管是线上还是线下,我们都可以用Arthas ...

  5. 白话科普,10s 了解 API

    作为一名又拍云的技术支持工程师,小拍每天都会接收到很多客户的提问.这其中,有很多客户会问:"小拍,请问云存储上传除了使用控制台的文件管理和 FTP 工具之外,有没有其他的途径进行上传呢?&q ...

  6. [Luogu P2278] [HNOI2003]操作系统

    题面 传送门:https://www.luogu.org/problemnew/show/P2278 Solutiton 挺简单的一道模拟题,拿堆模拟一下题目意思就好 堆中有两个关键字,分别是优先级和 ...

  7. 【Flutter 实战】pubspec.yaml 配置文件详解

    老孟导读:pubspec.yaml 文件是 Flutter 中非常重要的配置文件,下面就让我们看看里面各个配置的含义. pubspec.yaml 是 Flutter 项目的配置文件,类似于 Andro ...

  8. C# Base64解码小工具编写

    1 界面如下 2 关键代码如下 try { var callback = reqStr.Deserialize<dynamic>(); resStr = Newtonsoft.Json.J ...

  9. SAM学习笔记&AC自动机复习

    形势所迫,一个对字符串深恶痛绝的鸽子又来更新了. SAM 后缀自动机就是一个对于字符串所有后缀所建立起的自动机.一些优良的性质可以使其完成很多字符串的问题. 其核心主要在于每个节点的状态和$endpo ...

  10. Pyston v2.0 发布,解决 Python 慢速的救星

    Pyston 自从 2017 年发布 0.6.1 版本后,已经淡出了人们的视线三年多了,导致现在新人都很少听过它的大名. 前两天(2020年10月28日)Pyston 在官方博客上(https://b ...