字符集和编码

字符集

在计算机中,协议通常代表数字和概念的映射关系,对于字符集就是使用数字映射到字符,查看
ASCII编码表看到,数字97映射为字符a,所以这个数字也叫ASCII字符集的字符码。

一种映射方案就是一个字符集,包括:ASCII,UTF8,GB2312,GBK,UTF16,UTF32,UNICODE,Latin 等等。中文字符集从先到后分别有:

  • gb2312,常用的6000汉字;
  • gbk,新增20000个汉字,包括繁体和符号等;
  • gb18030,新增少数民族字体。

Windows默认的中文字符集是GBK。

编码

有了数字和字符的映射关系,就需要考虑用多大内存存储一个数字,这就是编码。

通常情况下字符集和编码都是同一个概念,因为编码是固定的,比如GBK既是字符集也是编码,使用16位存储;但是有的字符集会有不同的编码格式,比如Unicode字符集就会对应utf-8编码、utf-16编码、utf-32编码等格式。

utf-8是变长编码,会根据情况分别使用8位、16位、32位存储;
utf-16是定长编码,固定使用16位编码;
utf-32是定长编码,固定使用32位编码;

utf-8编码方式如下:

- 0xxxxxxx: 0开头,代表读取单字节;
- 110xxxxx 10xxxxxx: 110开头,代表读取2个字节,后续字节以10开头,因为10开头的字节不能代表单字节,也不能代表多字节(没有这种编码),因此只能代表后续字节;
- 1110xxxx 10xxxxxx 10xxxxxx: 代表读取3个字节;
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx: 代表读取4个字节

Unicode字符集和编码

utf-8前127位,兼容ASCCII码,因为只使用了一个字节,所以字符码和字节码是相等的,
到双字节的时候,字符编码和字节编码对应的数字就不一样了,以汉字“你”为例:
字符码的表示方式,\u4F60;
字节码的十六进制表示方式,\xe4\xbd\xa0;
字节码的八进制表示方式,\344\275\240

具体编码的原理如下:

  • 字符 “你” 的 Unicode 编码值是 U+4F60,对应的十进制值是 20320。
  • 根据 UTF-8 编码规则,它需要使用三个字节来表示。
  • 第一个字节的高位(最左边的 bit)表示字节序列的长度。对于三个字节的编码,高位应该是 1110。
  • 第一个字节剩下的 5 位用来表示 Unicode 编码值的高 5 位,即 10011。
  • 后面两个字节的高两位都是 10,用来标识后续字节。
  • 将上述三个部分组合起来,得到 b’\xe4\xbd\xa0’。

在UTF-16这种定长编码中,字符集号和编码值应该是相等的。

系统编码和软件编码

软件编码分为两种:
一种是编译时硬编码到软件内的编码,这种取决于编译器使用的编码格式,比如在宽字符,在Windows上会硬编码为16位,但是在Linux上却会用32位解码;
另一种是运行时编码,比如文本编辑器编辑文本,此时文本编辑器采用的是运行时系统的编码格式。

Linux系统编码:

# 1.查看Linux系统默认编码格式
locale

# 2.修改Linux系统默认编码格式
sudo vim /etc/default/locale
    #LANG=en_US.UTF-8
    #LANGUAGE="en_US:en"
    LANG=zh_CN.UTF-8
    LANGUAGE="zh_CN:zh"
sudo reboot #重启

# 3.临时有效,只在当前终端有效
locale
export LANG=zh_CN.UTF-8
export LANG=en_US.UTF-8

Windows系统编码:

# 1. 查看Windows系统默认编码格式
chcp #查看默认编码

# 2.修改Windows系统默认编码格式
chcp 650001 #utf-8
chcp 936 #GBK
chcp 473 #美式英语

# 3.代码内更改
system("C:\\Windows\\system32\\chcp 65001");// 修改终端字符集为UTF8

Windows codepage是指Windows操作系统所使用的字符集编码,也称为代码页。它用于定义如何将Unicode字符转换为二进制数据并存储在计算机内存和硬盘上。不同的Windows操作系统版本和不同的语言版本都可能使用不同的codepage来支持不同的字符集和编码。例如,Windows中的中文版本可能会使用GB2312或GB18030编码的codepage,而英文版本可能会使用ASCII或ISO 8859-1编码的codepage。在Windows中,可以使用命令行工具chcp来切换codepage。

代码页 国家(地区)或语言
437 美国
932 日文(Shift-JIS)
936 中国 - 简体中文(GB2312)
950 繁体中文(Big5)
1200 Unicode
1201 Unicode (Big-Endian)
50220 日文(JIS)
50225 韩文(ISO)
50932 日文(自动选择)
50949 韩文(自动选择)
52936 简体中文(HZ)
65000 Unicode (UTF-7)
65001 Unicode (UTF-8)

在文本编辑器编辑:
char a = ‘你’;
键盘输入按键,传输给输入法,
输入法将输入信息编码为系统编码,比如Linux上编码为默认编码unicode,Windows上编码为默认编码GBK,
输入法将编码传给系统,系统dispatch给程序,
程序启动回显,
然后进行赋值,但是16位的编码被默认转换为了8位char类型。

C++编码

在C/C++中,char和wchar_t都不是固定的内存单位,而是抽象层概念。

char可被用于所有8 bit以下的字符集,例如US-ASCII、ISO-Latin-1和ISO-Latin-9。此外它可被用于UTF-8的8 bit值;

char16_t(始自C++11)可被用于UCS-2,也可用于UTF-16的code unit。

char32_t(始自C++11)可被用于UCS-4/UTF-32。

wchar_t代表所有超8位字符集中的最大值,在Windows上wchar_t是2个字节(16位),在Linux上是4字节(32位)。

C++程序的编码取决于编译器,编译器在编译时读取系统编码格式,作为C++程序的编码格式,所以编码时系统设置什么编码,编译器就使用什么编码。

另外,编码没有统一的规范,所以就没有统一的判断标准,很多程序都是靠统计数据来识别编码格式,所以并不是十分可靠。

python编码

字节串,python使用字节串作为通用的编码格式,即使用8位字节码读写数据。这样就可以屏蔽不同的编码格式进行传输了。

解码单个二进制:

# 解码字节码
chr()
chr(0x4f60)
chr(20320)

解码多个二进制:

# 方法一,使用bytes将十六进制字符转换为字节码
s = "0x43 0x3a 0x5c 0x00 0x44 0x3a 0x5c 0x00 0x45 0x3a 0x5c 0x00 0x46 0x3a 0x5c 0x00 0x49 0x3a"
a = s.replace(" ","").replace("0x","")
b = bytes.fromhex(a)
print(b.decode())


# 方法二,使用chr直接转换字符数字为字符
s = "0x43 0x3a 0x5c 0x00 0x44 0x3a 0x5c 0x00 0x45 0x3a 0x5c 0x00 0x46 0x3a 0x5c 0x00 0x49 0x3a"
# 将字符串分割成十六进制值列表
hex_values = s.split()
# 将每个十六进制值转换为对应的字符
characters = [chr(int(hex_value, 16)) for hex_value in hex_values]
# 将字符列表连接成一个字符串
result = ''.join(characters)
print(result)

需要注意: b'0x43'存储的不是数字0x43,而是0 x 4 3
可以将字符数字转化为字符的,只有chr()

解码字节码:

# unicode码
'\u4f60'

# utf-8,八进制字节码
b'\344\275\240'.decode()

# utf-8,十六进制字节码
b'\xe4\xbd\xa0'.decode()

Qt编码

Python内使用的是8位通用字节码,QT中使用的是16位通用字节码。
Qstring存储的是16位字符。
QString类是Qt库中用于处理字符串的类,它存储的是UTF-16编码的字符串。在内部,QString使用16位的Unicode码点来表示字符,因此它适用于处理多语言文本和特殊字符。

Qt库提供了QByteArray类来处理字节数据,可以用于存储和处理UTF-8编码的字符串。如果你有一个UTF-8编码的字符串,可以使用QByteArray来进行存储和操作,然后使用适当的转换函数将其转换为QString。

网络编码

Base64编码,将所有字符转换为可见字符,以实现完整传输和平台无关。

参考链接

C/C++语言中的字符类型
彻底弄懂 Unicode 编码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多弗朗强哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值