计算机编码与Python的编码

计算机编码与Python的编码

1 编码知识

1.1 概念

  • 信息: 狭义上是人类活动中所需相互传达的某种信号。

  • 数据: 是携带信息的介质。这种介质有多种格式,可能是:数字,音频,视频,文字等等。简单的来讲,数字是一种工具,1是数字的一个内容,但是如果数字为工具,表达数量的概念。那么‘1个苹果’,‘1个人’就是我们所需传达、被理解的信号。

  • 编码:编码是信息从一种形式(数据,如汉字)或格式转换为另一种形式的过程。所以说,宏观的讲,编码也是携带数据、信息的一种介质,是计算机生成的一种介质。计算机不能读懂汉字,但是能通过编码,识别操作。

  • 解码: 解码是受传者将接受到的符号或代码还原为信息的过程,与编码过程相对应。

 简单来说,从明文到编码文字,称为"编码"。从编码文字解释出到明文,称为"解码"。

1.2 六种编码文字

  1. ASCII: 计算机存储数据是用了一个个电阻单元,打开为:1,关闭为: 0,称为1bit,也正为1位。最早,美国人用八个电阻去表达字符符,也就能表达256个不同的字符,英文单词才有26个,加上一些特殊字符也绰绰有余了。如字符A -> 00010001。

  2. ANSI: 扩展的ASCII码,早期的字符刚满128个。所以第8位往往是0。为了表示更多字符,有扩展了第八位。共可表达256位字符,其中包含了一些拉丁文。

  3. GB2312: 在中国日新月异的发展当中,计算机编码也传递了过来。但是,之前的编码不能表达汉字。所以1980年,我国自主研发了GB2312编码。把第8位对应的拉丁文删除。将二进制数值小于127的字符意义不变,仍表示英文字符和一些特殊字符;但将大于127的字符,于另一大于127的字符自由组合,表示为一个特定的汉字。简单来说,就是两个大于127的字节表示一个中文汉字。共能表示7000多个汉字。其也算是对ASCII编码的扩展。

  4. GBK与GB18030: 但是7000个汉字,是不够用的。所以,之后扩展为,当第一个字节大于127,后接随意字节,就表示为一个汉字。在GB2312的基础上,又增加了20000多个汉字(包含一些繁体字和符号)。

  5. UNICODE: 该编码用两个字节表示一个字符,256*256 = 65536 个。 共可以表示6万5千多种不同的字符,足以可以表示全世界所有的有意义字符(包括甲骨文)。你可以向我一样,称它为“UNIQUE CODE”,天下独一的编码。

  6. UTF-8: 有了UNICODE,为什么还发展出新的编码了呢。是因为,本来一个字节都可以存储所有26个英文字符,为什么还非要两个字节,造成存储冗余呢。所以,美利坚的专家们针对此问题创造了自由度较高的UTF-8。它可以是用1-4个字节来表示一个字符。当一个字符的二进制长度小于127,就尽可能用ASCII码来表达。根据不同的符号类型,来变换长度。常用中文字符占3个字节(2w+),一些难写的字占4个字节。

那么,具体编码是长什么样子呢?在这给一个编码在线转换器。

1.3 编码及转码

  1. UNICODE的编码

    str = 'U are a 小狗 ’ # 这是我们可以看懂的一句明文,包含英文、汉字

以下为UNIDODE编码,\u为标识符,后加4个16进制的数字:

以一个英文字母及一个汉字为例:

U: 0055 
狗: 5c0f

上述因为是16进制,为什么要选择16进制?这是因为一个16进制的数字能表达所有4位二进制的数字,两个16进制的数字能表示一个字节的大小,记录长度从8位缩短至2位,减少记录冗余。那么转换成二进制: 进制转换器

U: 00000000 01010101 
狗:01011100 00001111

不难发现,UNICODE对于英文及汉字都是用两个字节来存储的。
有时候,我们发现U的UNICODE码也可以写成&#x85。其实\u开头和&#x开头是一样的,\u代表UNICODE16进制的写法,&#x表示10进制的写法。

0x开头代表十六进制 \u则代表unicode编码 \x对应的是UTF-8编码的数据

  1. UTF-8的编码

U: 01010101 狗: 00000001 00011001 00100001
英文字符延用了ASCII的规则,用一个字节表示。但是中文字符用2~4个字节来表示。因为程序多是用到了英文字符。所以,当程序文本量大的时候,UTF-8比UNICODE能节省许多存储空间。

2 Python的编码

  python作为一种供计算机用户编写程序的高级语言。当我们用其书写一些明文的时候,它内部会帮我们转成默认的编码字符,提供给计算机处理。所以,我们要了解python2\python3的默认编码以及我们可以做出的修改。

2.1 Python2的编码

1> py2默认编码类型认为ASCII:

默认是ASCII编码,str类型。但是当IDE无指定UTF-8、ANSI等编码文字的时候,会报错,因为ASCII编码无法表示汉字字符。
加上抬头:

# *-* coding: utf-8

就是默认当使用IDE写字符串的时候,编码文字是UTF-8:

2> py2加u,显示unicode编码:

可以发现,ASCII方式的字符串被py2标记为str类型,unicode方式的字符串被py2标记为unicode类型,其他外部使用的编码,py2也标记为str类型。

那么如何转换成其他编码呢?

  • UNICODE转GBK:

编码是给机器看的,明文是给人看的,print就是直接打印当前编码的明文。
发现,编码成GBK会乱码,这是因为两码不通的缘故。

  • UNICODE转UTF-8:

 **3> 总结:**py2的字符类型就设置为两种: str及unicode类型。其他如utf-8、gbk显示也是默认的str字符串类型,被转换成几个ASCII码。但是其实真正的ASCII编码中是不包含这个编码的明文的。

4> 解码decode: 就是将编码转换成明文。由于,每种编码方式都有不同的编码规则,所以就要选用对应的解码规则。不然就会报错:

正确解码:

2.2 Python3的编码

&emsp: 1> py3也有两种类型,我觉得这两种类型更符合人的认知意识,就是明文字符串和字节表示符:

str就是明文字符串,bytes就是字节表示符(多进制来表示)。

 总之py3是更符合人的思维逻辑的。encode就是编码,是机器能读懂的编码文字。decode就是解码,解释出人能看懂的明文。

2.3 个人对python编码的理解

  我觉得,在python2交互输入框中输入字符串的时候,不用IDE、不加u则会报错,因为默认编码为ASCII码,没有中文字符。加u编码是UNICODE,直接解码显示为明文。输入明文,就默认解码显示明文了,内部编码类型是UNICODE。

 在python3中,也有两种字符串格式类型了,但是该str是指明文字符串,bytes是指编码的字节表示符。

3 编码的延伸

3.1 软件的默认编码

 其实,当我查阅资料的时候,有些人讲:其实许多软件内部都把默认存储编码选择为UNICODE,这是因为UNICODE又被称为万国码,因为它能存储6W5千多个符号,汉字、英文、拉丁文、日文等尽收囊中。包罗万象、兼容性最佳。当我们把软件的显示编码调试为ANSI、UTF-8的时候,在存储时,都会先转换为UNICODE,再进行存储。

 究竟内部存储编码类型,为UNICODE或者是其他GBK、ANSI、UTF-8等都是无所谓的。我们只需要知道:

  •   1> 当我们在用计算机交互软件的时候,我们输入自己能看懂的明文,但是其实计算机是看不懂的。所以,软件内部就必须要有能够转换明文到编码文字的编码,如cmd窗口、记事本、word在打开软件的时候,都有指定对应的默认编码。那么软件的默认编码都是什么呢?如word就默认为UNICODE,这是因为UNICODE是包罗万象的万国码,兼容性最佳。

  •   2> 当我们保存文件到计算机存储介质的时候,明文其实就已经被软件通过某种编码规则编辑成一种记录方式了,但不管怎么,其记录单元都是字节->电阻单元。

  •   3> 当我们从存储介质找到相应文件并打开时,软件又自动帮我们解码成能看懂的明文。

 py2默认编码解码方式为ASCII,py3为UTF-8。通过以下方式可以查询:

import sys
print(sys.getdefaultencoding())

3.2 声明;执行.py文件

指这个.py文件是以utf-8进行存储的。

# *-* coding:utf8

是的,这就是因为如果py2解释器去执行一个utf8编码的文件,就会以默认地ASCII去解码utf8,一旦程序中有中文,自然就解码错误了,所以我们在文件开头位置声明 #coding:utf8,其实就是告诉解释器,你不要以默认的编码方式去解码这个文件,而是以utf8来解码。而py3的解释器因为默认utf8编码,所以就方便很多了。

3.3 常见打开文件乱码或报错

 在我们保存一种文本文件,并用python自带的f = open(file)去打开的时候,会发现f的内容为乱码或者报错。这是因为,文件file可能是ANSI的编码,但是python3默认的编码解码类型是UTF-8,所以就会出现乱码。或者,windows操作系统默认为gbk解码方式,打开utf-8文件报错。

 这时候,就可以指定编码方式,f = open(file, encoding = ‘UTF-8’)

猜你喜欢

转载自blog.csdn.net/qq_40260867/article/details/86430731
今日推荐