前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python字符的编码与解码

python字符的编码与解码

作者头像
叶子陪你玩
发布2020-05-14 20:44:21
1.1K0
发布2020-05-14 20:44:21
举报

什么是字符编码

计算机里面是由各种电子电路组成的,它是如何识别我们的写的字符的,比如hello ,你,我。

直接识别是不可能,它只能识别 二进制的0,1字符。所有我们输入进去的字符,最终都会被转化成0,1这种组合在一起的一串数字。

计算机存储信息的最小单位,称之为位(bit),又叫比特,二进制的一个“0”或一个“1”叫一位。

8个二进制位组成1个字节(Byte),1024字节(Byte)也就是1KB,1024KB是1M,这就是我们平常说的文件大小的单位(M),比如这个图片大小5M。

既然计算机是通过二进制的数字来识别不同字符的,那不同的字符该用多少个1和0,又该以什么样的顺序来排列呢?

为什么要字符编码

这里为了规范,就出现了ASCII编码。ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。

这里的编码规定了,每个字符由几个0和1组成,顺序也定下了。里面包含了控制字符或通信专用字符,阿拉伯数字,大小写英文字符,标点运算符号等,一共128个。

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

了解进制数

进制也就是进位计数制,是人为定义的带进位的计数方法。对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

下面就来通过python中自带的函数一起来验证一下。

理解:

ord() 函数:以一个字符串作为参数,返回对应的 ASCII 数值。

chr()函数:用一个整数作参数,返回一个对应的字符。可以二进制,十进制,十六进制。

不理解进制数的可以自己去学习一下,或者利用python自带的进制转换函数去试一下。

0b 开头表示二进制,0o表示八进制,0x表示十六进制,通过内置进制函数可以相互进行转换。

Hello这样的一个词语要被计算机认识,只要按照ASCII编码来就可以了。对应的16进制编码是:48 65 6C 6C 6F

编码的种类

百度百科:

在英语中,用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号 [5] 。 但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段 。 至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是 GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 256 x 256 = 65536 个符号 。

因为ASCII不够用了,所以需要扩展字符集。

百度百科:

不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、ShiftJIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 ShiftJIS 编码。[1] 简单的说,在简体中文系统下,ANSI编码代表GB2312编码;在日文操作系统下,ANSI编码代表JS编码。[2] 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。

但是这么多编码,很混乱,不同 ANSI 编码之间互不兼容,不同语言交流时会出现乱码。为了统一所有文字的编码,Unicode诞生了。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

虽然统一了所有字符,但是在存储和传输的时候,也带来了一些缺点,如果你传输的都是英文字符,使用unicode编码就会使用更多的字节,所以后面实现了utf-8编码,可以根据字符的情况进行可变的字节表示。

在文件保存的时候,其实是可以看见有编码选择的,平时可能不是很关注,读写文件出现编码格式错误,就可以从这方面来思考解决。

编码和解码

utf编码读取文件

ANSI读取文件/gbk

utf-8 带 bom读取

忽略错误会出现乱码

使用utf-8-sig编码可以解决这个问题

encode:将 Unicode 字符串转换为特定编码格式对应的字节码的过程

decode:将特定编码格式的字节码转换为对应的 Unicode 字符串的过程

Python3 的默认编码为 Unicode。

编码检测

有时候解码格式报错,但是我们并不知道它是什么编码,那该怎样解码?可以通过chardet这个模块来检测我们文件数据的一个编码格式,结果会显示可信度。

(全文完)


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是字符编码
  • 为什么要字符编码
  • 了解进制数
  • 编码的种类
  • 编码和解码
  • 编码检测
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档