Python字符集和字符编码详情

目录
  • 前言
  • 字符集和字符编码
  • 小结

前言

这一次我们分析一下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即可得到字符串,也就是根据编号找到对应的字符。

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

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

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

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

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

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字符编码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python字符编码转码之GBK,UTF8互转

    一.Python字符编码介绍 1.须知: 在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicode unicode 分为utf-32 (占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),所以utf-16 是最常用的unicode版本,但是在文件里存的还是utf-8,因为utf8省空间 在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型 在unicod

  • 关于Python字符编码与二进制不得不说的一些事

    二进制 核心思想: 冯诺依曼 + 图灵机 电如何表示状态,才能稳定? 计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性, 简单始终是建立再稳定.可靠基础上 经过尝试10进制,但很难检查电流的状态差异并且很难稳定状态,最稳定的检查是 通电和不通电状态,共两种状态那就规定 通电为 1 不通电 为 0,1和0的状态逻 辑被称为比特 Bit 那么如何用 0 和 1 表示数字和字符呢? 首先找出需要表示的字符,英文字符和数字字符才100多个,需要 7 个二进制位就 可以全部表示,但

  • Python字符串编码转换 encode()和decode()方法详细说明

    目录 1.Python encode()方法 2.Python decode()方法 前言: 我们知道,最早的字符串编码是 ASCII 编码,它仅仅对 10 个数字.26 个大小写英文字母以及一些特殊字符进行了编码.ASCII 码做多只能表示 256 个符号,每个字符只需要占用 1 个字节. 随着信息技术的发展,各国的文字都需要进行编码,于是相继出现了 GBK.GB2312.UTF-8 编码等,其中 GBK 和 GB2312 是我国制定的中文编码标准,规定英文字符母占用 1 个字节,中文字符占用

  • python中字符串的编码与解码详析

    1. 常用的编码 ASCII:只能表示一些字母,数字和特殊的字符,占一个字节 GBK:国家简体中文字符集和繁体字符集,兼容ASCII,占两个字节 Unicode:能够表示全世界上所有的字符,Unicode有人说占4个字节也有人说占2个字节,但中文占2个字节 UTF-8:Unicode的压缩版,占1~3个字节,其中中文占三个字节 2.补充:计算机表示的单位: bit: 位,计算机最小的表示单位 bytes:字节,最小的存储单位,1bytes=8bit,1bytes简写成1B 1KB = 1024B

  • python抓取网页时字符集转换问题处理方案分享

    问题提出: 有时候我们采集网页,处理完毕后将字符串保存到文件或者写入数据库,这时候需要制定字符串的编码,如果采集网页的编码是gb2312,而我们的数据库是utf-8的,这样不做任何处理直接插入数据库可能会乱码(没测试过,不知道数据库会不会自动转码),我们需要手动将gb2312转换成utf-8. 首先我们知道,python里的字符默认是ascii码,英文当然没问题啦,碰到中文的时候立马给跪. 不知道你还记不记得,python里打印中文汉字的时候需要在字符串前面加 u: print u"来搞基吗?&

  • Python检测字符串中是否包含某字符集合中的字符

    目的 检测字符串中是否包含某字符集合中的字符 方法 最简洁的方法如下,清晰,通用,快速,适用于任何序列和容器 复制代码 代码如下: def containAny(seq,aset):     for c in seq:          if c in aset:                 return True     return False 第二种适用itertools模块来可以提高一点性能,本质上与前者是同种方法(不过此方法违背了Python的核心观点:简洁,清晰) itertoo

  • Python字符集和字符编码详情

    目录 前言 字符集和字符编码 小结 前言 这一次我们分析一下Python的字符串,首先字符串是一个变长对象,因为不同长度的字符串所占的内存是不一样的:但同时字符串又是一个不可变对象,因为一旦创建就不可以再修改了. 而Python中的字符串是通过unicode来表示的,在底层对应的结构体是PyUnicodeObject.不过话说回来,为什么需要unicode呢? 首先计算机存储的基本单位是字节,由8个比特位组成,由于英文字母算上大小写只有52个,再加上若干字符,数量不会超过256个,因此一个字节完

  • 字符集和字符编码(Charset & Encoding)

    相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来我们要探讨的. 目录: 1.基础知识 2.常用字符集和字符编码2.1. ASCII字符集&编码2.2. GBXXXX字符集&编码2.3. BIG5字

  • Python 中 Elias Delta 编码详情

    目录 1.分步实施 第1步: 第2步: 第3步: 第4步: 语法: Elias Delta Encoding(X)= Elias Gamma encoding (1+floor(log2(X)) + Binary representation of X without MSB. 1.分步实施 首先,在为 Elias Delta 编码编写代码之前,我们将实现 Elias delta 编码. 第1步: 从数学库导入 log.floor 函数以执行对数运算. 从用户获取输入 k 以在 Elias Ga

  • 老生常谈Python基础之字符编码

    前言 字符编码非常容易出问题,我们要牢记几句话: 1.用什么编码保存的,就要用什么编码打开 2.程序的执行,是先将文件读入内存中 3.unicode是父编码,只能encode解码成其他编码格式 utf-8,GBK这些是子8编码,只能decode编码成Unicode 一.什么是字符编码 我们知道,计算机只能识别二进制,我们平时写的代码都需要转成二进制才能被计算机识别.所以,我们写的字符怎么转换成二进制呢,这个过程实际就是通过一个标准使我们写的字符与特定数字一一对应,这个标准就称为字符编码. 字符-

  • python源文件的字符编码知识点详解

    默认情况下,Python 源码文件以 UTF-8 编码方式处理.在这种编码方式中,世界上大多数语言的字符都可以同时用于字符串字面值.变量或函数名称以及注释中--尽管标准库中只用常规的 ASCII 字符作为变量或函数名,而且任何可移植的代码都应该遵守此约定.要正确显示这些字符,你的编辑器必须能识别 UTF-8 编码,而且必须使用能支持打开的文件中所有字符的字体. 1.如果不使用默认编码,要声明文件所使用的编码,文件的第一行要写成特殊的注释. 语法如下所示: # -*- coding: encodi

  • oracle查看字符集和修改字符集使用详解

    一.什么是Oracle字符集Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台. 影响Oracle数据库字符集最重要的参数是NLS_LANG参数.它的格式如下: NLS_LANG = language_territory.charset它有三个组成部分(语言.地域和字符集),每个成分控制了NLS子集

  • mysql字符集和校对规则(Mysql校对集)

    简要说明 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于比较字符的一套规则. MySql在collation提供较强的支持,oracel在这方面没查到相应的资料. 不同字符集有不同的校对规则,命名约定:以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)._cs(大小写敏感)或_bin(二元)结束 校对规则一般分为两类: binary collation,二元法,直接比较字符的编码,可以认为是区分大小写的,因为字符集中'A'和'a'的编码显然不同. 字符集

  • Mysql字符集和排序规则详解

    目录 前言 什么是字符集 什么是比较规则 常用字符集 ASCII字符集 ISO8859-1 GB2312 GBK字符集 Unicode字符集 注意点 Mysql中查询字符集和比较规则 查询字符集 查询比较规则 前言 计算机存储数据的方式都是二进制数据,但是我们在mysql中存储的是字符串数据,那么这些数据到底在Mysql中如何存储呢?这就涉及到字符集的概念. 什么是字符集 举例如下,假设存在编码集test,只能识别a,b,A,B这几项,同时编码规则如下: a---->00000001(0x01)

  • 一文带你了解MySQL字符集和比较规则

    目录 1. MySQL中的utf8和utf8mb4 2. MySQL中的比较规则 3. 各级别的字符集和比较规则 3.1 服务器级别 3.2 数据库级别 3.3 表级别 3.4 列级别 4. 修改字符集或比较规则 5. MySQL中的字符集转换过程 总结 1. MySQL中的utf8和utf8mb4 在MySQL中,我经常会看见utf8和utf8mb4这两种编码格式,但是这两种格式我并不了解,一般创建数据库的时候,如果让我选,我默认会选择utf8,但是这个和UTF-8长得最像. 但是实际上,这两

  • asp 实现对SQL注入危险字符进行重编码处理的函数

    <% '****************************** '函数:CheckStr(byVal ChkStr) '参数:ChkStr,待验证的字符 '作者:阿里西西 '日期:2007/7/15 '描述:对SQL注入危险字符进行重编码处理 '示例:CheckStr("and 1=1 or select * from") '****************************** Function CheckStr(byVal ChkStr)  Dim Str:Str

随机推荐