脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Python字符集和字符编码详情

Python字符集和字符编码详情

2022-12-28 14:42编程学习网 Python

这篇文章主要介绍了Python字符集和字符编码详情,Python中的字符串是通过unicode来表示的,在底层对应的结构体是PyUnicodeObject,但是具体为什么呢?带着疑问一起学习下面文章内容吧

前言

这一次我们分析一下Python的字符串,首先字符串是一个变长对象,因为不同长度的字符串所占的内存是不一样的;但同时字符串又是一个不可变对象,因为一旦创建就不可以再修改了。

而Python中的字符串是通过unicode来表示的,在底层对应的结构体是PyUnicodeObject。不过话说回来,为什么需要unicode呢?

首先计算机存储的基本单位是字节,由8个比特位组成,由于英文字母算上大小写只有52个,再加上若干字符,数量不会超过256个,因此一个字节完全可以表示。但是随着计算机的普及,越来越多的非英文字符出现,导致一个字节已经无法表示了。所以只能曲线救国,对于一个字节无法表示的字符,使用多个字节表示

但是这样会出现两个问题:

  • 因为每个国家都有自己的字符编码,所以不支持多国语言,例如中文的编码不可以包含日文,否则就会造成乱码;
  • 没有统一标准,例如中文有GB2312、GBK、GB18030等多个标准;

到这里我们先不继续往下深入,我们先来理清楚一些概念。

字符集和字符编码

估计有很多小伙伴搞不清这两者的区别,我们先来解释一下所谓的字符集和字符编码是怎么一回事?

字符集:系统支持的所有字符组成的集合,像ASCII、GB2312、Big5、unicode都属于字符集。只不过不同的字符集所能容纳的字符个数不同,比如ASCII字符集中不包含中文,unicode则可以容纳世界上的所有字符;

字符编码:负责将每个字符转换成一个或多个计算机可以接受的具体数字,该数字可以理解为编号,因此字符编码维护了字符和编号之间的对应关系。而编码也分为多种,比如ascii、gbk、utf-8等等,字符编码不同,那么字符转换之后的编号也不同,当然能转化的字符种类也不同。比如ASCII这种字符编码,它就只能转换ASCII字符。

当然,ASCII比较特殊,它既是字符集、也是字符编码。并且不管采用什么编码,ASCII字符对应的编号永远是相同的。

将字符串中的每一个字符转成对应的编号,那么得到的就是字节序列(bytes对象),因为计算机存储和网络通讯的基本单位都是字节,所以字符串必须以字节序列的形式进行存储或传输。

因此字符串和字节序列在某种程度上是很相似的,字符串按照指定的编码进行encode即可得到字节序列,也就是将每个字符都转成对应的编号;字节序列按照相同的编码decode即可得到字符串,也就是根据编号找到对应的字符。

比如我们写了一段文本,然后在存储的时候必须先进行编码,也就是将每一个字符都转成一个或多个系统可以接受的数字、即对应的编号之后,才可以进行存储。

?
1
2
3
s = "你好"
# 编码之后就是一串数字
print(s.encode("gbk"))  # b'\xc4\xe3\xba\xc3'

假设文本中只有你好二字,在存储的时候采用gbk进行编码,那么在读取的时候也必须使用gbk进行解码,否则的话就会无法解析而报错。因为字符编码不同,字符对应的编号也不同。

再比如每个国家都有自己的字符编码,你在日本的一台计算机上写好的文件拿到中国的计算机上打开,很有可能出现乱码。因为字符编码不同,字符和编号之间的对应关系也不同,采用不同的字符编码进行解析肯定会出问题。

但我们说,对于ASCII字符来说,由于不管采用哪一种编码,它们得到的编号都是固定的。所以编码对于ASCII字符来说,没有任何影响。

?
1
2
3
4
5
6
7
8
9
10
11
12
s = "abc"
print(s.encode("gbk"))  # b'abc'
print(s.encode("gbk").decode("utf-8"))  # abc
 
# 但如果是非ASCII字符,就不行了
try:
    s = "你好"
    s.encode("gbk").decode("utf-8")
except UnicodeError as e:
    # 报错了,无法解析
    print(e) 
    # 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

这里我们再回忆一下bytes对象,我们创建的时候可以采用字面量的方式,比如 b"abc",但是 b"憨"却不可以。原因就是憨这个字符不是ASCII字符,那么采用不同的字符编码,其对应的编号是不同的,而这种方式Python又不知道我们使用哪一种编码,所以不允许这么做,而是需要通过"憨".encode的方式手动指定字符编码。

但是对于 ASCII 字符而言,不管采用哪一种字符编码,得到的编号都是一样的, 所以Python针对ASCII字符则允许这种做法,比如b"abc"。并且我们看到,对于汉字来说,在编码之后会对应多个编号,而每个编号占1字节,因此不同的字符所占的大小可能不同。

小结

以上就是字符集和字符编码,字符集就是字符组成的集合,不同字符集所能容纳的字符数量是有限的。字符编码是将字符转成对应的编号,比如将一个字符串中的所有字符都转成对应的编号之后,就得到了字节序列。

当然和字符集一样,字符编码能转换的字符种类也是有限的,像汉字我们可以使用 gbk 编码、utf-8 编码,但是不能使用 ascii 编码。

到此这篇关于Python字符集和字符编码详情的文章就介绍到这了,更多相关Python字符编码内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7087772023178395685

延伸 · 阅读

精彩推荐
  • Python详解Python中*args和**kwargs的使用

    详解Python中*args和**kwargs的使用

    本文我们将通过示例了解Python中*args和 **kwargs的使用方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    赵卓不凡8592022-11-24
  • PythonPython实现的逻辑回归算法示例【附测试csv文件下载】

    Python实现的逻辑回归算法示例【附测试csv文件下载】

    这篇文章主要介绍了Python实现的逻辑回归算法,结合具体实例形式分析了Python逻辑回归算法相关实现技巧,需要的朋友可以参考下...

    njulpy4072021-05-09
  • Pythonpython opencv 图像尺寸变换方法

    python opencv 图像尺寸变换方法

    下面小编就为大家分享一篇python opencv 图像尺寸变换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    看穿数据之美7232021-01-26
  • PythonPython基于QRCode实现生成二维码的方法【下载,安装,调用等】

    Python基于QRCode实现生成二维码的方法【下载,安装,调用等】

    这篇文章主要介绍了Python基于QRCode实现生成二维码的方法,结合实例形式较为详细的分析了Python下载,安装与调用QRCode实现生成二维码功能的具体步骤与相关...

    微烟波4112020-11-25
  • Python解决Python中字符串和数字拼接报错的方法

    解决Python中字符串和数字拼接报错的方法

    python是强类型的语言,如果你把一个字符串和数字直接做连接的操作的话,就会直接报错的,今天就给大家说下字符串和数字拼接的问题,有需要的朋友们...

    Python教程网13842020-09-10
  • PythonPytorch之如何dropout避免过拟合

    Pytorch之如何dropout避免过拟合

    这篇文章主要介绍了Pytorch 如何dropout避免过拟合的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    Giao哥不瘦到100不改名7232021-11-22
  • PythonPython Socket实现简单TCP Server/client功能示例

    Python Socket实现简单TCP Server/client功能示例

    这篇文章主要介绍了Python Socket实现简单TCP Server/client功能,结合实例形式分析了Python基于socket创建TCP服务器Server与客户端client相关实现步骤与操作技巧,需要...

    奔跑吧大龙10362020-11-30
  • Pythonpython脚本定时发送邮件

    python脚本定时发送邮件

    这篇文章主要为大家详细介绍了python脚本定时发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    缘自天方12512021-08-17