Python 字符集,python查看字符串的编码格式

  Python 字符集,python查看字符串的编码格式

  本文主要介绍Python字符集和字符编码细节。Python中的字符串用unicode表示,底层对应的结构是PyUnicodeObject,但是为什么呢?我们带着问题来学习下面这篇文章吧。

  00-1010前言字符集和字符编码概要

  

目录

  这次,我们来分析一下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对象)。因为计算机存储和网络通信的基本单位是字节,所以字符串必须以字节序列的形式存储或传输。

  因此,字符串和字节序列在某种程度上是相似的,字节序列可以按照指定的编码对字符串进行编码得到,即每个字符转换成相应的数字;按照同样的解码方式对字节序列进行解码就可以得到字符串,即根据数字找到对应的字符。

  比如我们写一段文字,在存储的时候要先进行编码,也就是把每个字符转换成一个或多个系统可以接受的数字,也就是对应的数字之后才能存储。

  你好

  #代码后是一串数字

  print(s . encode( gbk )# b \ xc4 \ xe3 \ xba \ xc3

  假设文本中只有“hello”这个词,存储时用gbk编码,读取时也必须用gbk解码,否则不会解析,会报错。由于字符编码不同,对应的字符数也不同。

  例如,每个国家都有自己的字符代码。如果在中国的电脑上打开日本电脑上写的文件,很可能会出现乱码。因为字符码的不同,字符和数字的对应关系也不同,所以用不同的字符码解析肯定会有问题。

  但是,我们说对于ASCII字符,无论采用哪种编码,其编号都是固定的。所以编码对ASCII字符没有影响。

  s=abc

  打印(s . encode( gbk )# b ABC

  打印(s.encode(gbk )。解码( utf-8 )# ABC

  #但是如果它是非ASCII字符,它就不起作用

  尝试:

  你好

  s.encode(gbk )。解码(“utf-8”)

  除了UnicodeError作为e:

  #报告错误,无法解析。

  打印(e)

  # utf-8 编解码器无法解码

  de 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字符编码内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: