python学习之字符集:GBK,GB18030,Unicode,UTF-8

背景

最近在学习和使用python时经常会遇到一些关于字符编码问题;虽然解决了问题,但是一直没有认真梳理这方面的知识;所以,这次写这篇文章整理一下知识点;本文都是通过在网上寻找资料并自己通过代码验证,如有错误欢迎指正。

环境

python 3.6

基本概念

比特位

二进制的0或1称为1个bit比特

字节

8个bit组成1个字节byte

字符

根据使用的字符编码方式不同每个字符所占用的字节数不一样;
例如,汉字“中”,在gbk字符编码方式下为2个字节,而在utf-8字符编码时为3个字节

>>> '中'.encode('gbk')
b'\xd6\xd0'
>>> '中'.encode('utf-8')
b'\xe4\xb8\xad'

字符集

字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。

字符编码

字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。

编码encode

将字符串通过制定的一种字符编码方式转换为二进制数据;

>>> a = '中'.encode('gbk')
>>> a
b'\xd6\xd0'

将汉字“中”按照“GBK”字符编码方式转换为二进制数据;

解码decode

将二进制数据通过一种字符编码方式转换为字符串;

>>> str(a,'gbk')
'中'

将二进制数据按照“GBK”字符编码方式转换为中文字符“中”;

常用字符集

中文GB字符集

GB2312

GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。

>>> a = "中".encode("gb2312")
>>> a
b'\xd6\xd0'
GBK

GBK是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字

>>> a = "中".encode("gbk")
>>> a
b'\xd6\xd0'

可以看到GBK和GB2312编码得到的二进制数据是相同的,即GBK完全向下兼容GB2312;

GB18030

GB18030中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。

>>> a = "中".encode("gb18030")
>>> a
b'\xd6\xd0'

可以看到GB18030和GBK编码得到的二进制数据是相同的,即GB18030完全向下兼容GBK和GB2312;

Unicode字符集

在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统。Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式对外发表。Unicode 还不断在扩增, 每个新版本插入更多新的字符。

Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储

UTF-32字符编码

使用4个字节来存储Unicode字符;

UTF-16字符编码

使用2个字节来存储Unicode字符;

>>> a = '中'.encode('utf-16')
>>> a
b'\xff\xfe-N'
UTF-8字符编码

UTF-8使用1~4字节为每个字符编码;
1,一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
2,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
3,其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
4,其他极少使用的语言字符使用4字节编码。

>>> a = '中'.encode('utf-8')
>>> a
b'\xe4\xb8\xad'

字符集转换

>>> a = '中'   # python的字符串类型(str)为unicode字符
>>> b = a.encode('utf-8')  # 将变量对应的字符串按照utf-8方式编码后得到字节数组b
>>> b
b'\xe4\xb8\xad'
>>> b.decode('utf-8')
'中'
>>> b.decode('utf-8').encode('gbk')  # 将字节数组b按照utf-8解码然后按照gbk编码得到其对应的字节数组
b'\xd6\xd0'

结语

日常开发中经常会遇到字符集的问题;这时需要注意,当我们接收到对方发来的字节流时我们只需要将此字节流采用对方编码时使用的编码方式进行解码,则不会出现乱码问题。
希望对你有帮助。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值