自学Python之路——中文编码

关于Python 编码的自我理解

导引:其实我也不知道,为什么要写这个关于编码问题。因为,在实际开发中,一般情况我们都是直接使用的集成工具来进行写代码。在集成工具里面,编码也好、解码也好。我们也从来不会过多的去关注,但是在看了python的教程之后,我觉得程序员坐久了,都有强迫症。不记录下来,总觉的笔记不完整。下面就说说,一个初学者这对python编码的理解。同时也欢迎大家留言发表自己的独到见解。

  1. 先通过一段代码,初步认识一下什么是编码。
#! /user/bin/python
print "你好,世界"

自学Python之路——中文编码
从上面的执行结果,我们可以看出,大概意思就是 非ASCII 编码。那么就引出两个问题:

  1. 什么是ASCII编码?
  2. 我们的python编辑器默认的编码方式是什么?
    ->ascii:(American Standard Code for Information Interchange:美国信息交换标准代码),关于ascii码,请看下面这张编码表。
    自学Python之路——中文编码
    这里我们都知道,计算机是外国人发明的东西,而且计算机遵循的是二进制算法,也就是说,计算机只能识别 0 或者 1。计算机最小的单位是bit(位),一个bit位只能存储两种情况,要么是0,要么是1。

因为bit是一个非常小的单位,用它来描述计算机存储的数据,显然不太合适。因此我们有了另一个单位叫字节(Byte)。

1B = 8b

而每一位又有两种情况,因此1个字节可以储存 2^8 = 256个数据,从上面的ascii码对照表中,我们可以看出一共也只用了0~127(128),第0位,不存储任何数据。这里对于英语语言的国家的来说,显然是足够的,英语一共26个字母,大小写加一起52个,再加0 ~ 9,10个数字·······,一个字节长度,256个数据,也足够用了。但是对于中国的汉语文字来说,呵呵 ~,估计汉子常用的怎么说也不少于10000个吧,显然ascii码这时候,就不行了。这时候,各个国家,都选择在ascii码的基础上,使用一个位映射到另一张码表,比如第128位,指向另一张码表,在那张码表中,对应的是各个国家的编码。这时候又有一个问题出现:
比如:中国想用第128位来对应中国编码,想让韩国用129位,想让日本用130位,你觉得比人愿意吗?凭什么听你的?我韩国也用129位。

这会导致一个什么现象?
你的电脑只能在自己的国家,安装自己国家的系统软件。其他的下来全都乱码。

为了解决这个问题,国际组织发布一套编码规则,叫Unicode(万国码)。
unicode:规定至少16位(2个字节长度来表示),这下就把全世界的编码都包含在内了。同样有个问题出现了:
原本在ascii码中:
0000 0001 表示一个数据。在unicode编码系统中就需要:
0000 0000 0000 0001 白白浪费了一定的空间。
假如:同一篇英文文章,用ascii码,只需要100kb,但是用unicode码之后,则需要200kb了。
为了改进unicode编码的不足,utf-8编码诞生了。在utf-8编码规则中,定义了:
ascii码中的字符:用1个字节来保存
欧洲的字符:用2个字节来保存
东亚的字节:用3个字节来保存

这里有个转换关系,如果想要实现 A码 和 B码相互转换,不能直接转换,必须要借助unicode,作为中转才行。
自学Python之路——中文编码

下面以代码为例:

#! /user/bin/python
# -*- coding: utf-8 -*-
print "你好,世界"

自学Python之路——中文编码
这里我们可以发现,我们开头的第二行代码,已经声明了编码方式 utf-8,编译也通过了,说明我们打印的内容已经以utf-8编码的格式显示在终端上,问题是为什么显示出来的内容乱码了呢?
我打开了cmd的属性设置,看了一下,发现:
自学Python之路——中文编码
我们的cmd显示,是以GBK编码方式显示的。那么我们要实现cmd窗口显示不乱码,就必须要进行utf-8和GBK之间转换。需要通过unicode来实现。

#! /user/bin/python
# -*- coding: utf-8 -*-

Title_utf = "你好,世界"
# utf-8 -> unicode:解码
Title_unicode = Title_utf.decode('utf-8')

# unicode -> GBK:编码

Title_GBK = Title_unicode.encode('gbk')
print (Title_GBK)

自学Python之路——中文编码
注意:这里的编解码是在python2.7环境下,在python3环境下,默认的就是unicode,因此我们只需要把unicode编码成我们想要的就可以了。

#! /user/bin/python
# -*- coding: utf-8 -*-

Title_unicode = "你好,世界"
Title_gbk = Title_unicode.encode('gbk')
print(Title_gbk )