python基础之:字符编码
3.字符编码
前言
编码(Encoding) 与解码(Encryption)
编码和加密都是对格式的一种转换,但是它们是有区别的:
- 编码是公开的,比如下面要介绍的Base 64编码,任何人都可以解码;
- 加密则相反,你只希望自己或者特定的人才可以对内容进行解密。
1 汉字字符集编码
- GB2312编码:1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。
- BIG5编码:台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。
- GBK编码:1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
- GB18030编码:2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。
2 ASCII 编码
ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字;
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓***奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。***
后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。
3 HTML编码
**HTML 实体:**在 HTML 中,某些字符是预留的。在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities):
#实体名称
&entity_name;
或者
# 实体编号
&#entity_number;
显示内容 | 描述 | 实体名称(大小写敏感) | 实体编号 |
---|---|---|---|
| 空格 | |   |
< | 小于号 | < | < |
> | 大于号 | > | > |
& | 和号 | & | & |
" | 引号 | " | " |
’ | 撇号 | ' (IE不支持) | ' |
¢ | 分(cent) | ¢ | ¢ |
£ | 镑(pound) | £ | £ |
¥ | 元(yen) | ¥ | ¥ |
€ | 欧元(euro) | € | € |
§ | 小节 | § | § |
© | 版权(copyright) | © | © |
® | 注册商标 | ® | ® |
™ | 商标 | ™ | ™ |
× | 乘号 | × | × |
÷ | 除号 | ÷ | ÷ |
3.1不间断空格(non-breaking space)
浏览器总是会截短 HTML 页面中的空格。如果您在文本中写 3 个空格,在显示该页面之前,浏览器会删除它们中的 2 个。如需在页面中增加空格的数量,您需要使用
字符实体。
4 Unicode
- 可以表示所有字符和符号的编码。
- 为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多
4.1 UTF-8 编码
,是对Unicode编码的压缩和优化,是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存。好处是节省空间;
4.2 UTF-7 编码
UTF-7 (7-位元 Unicode 转换格式(Unicode Transformation Format,简写成 UTF))是一种可变长度字符编码方式, 用以将 Unicode 字符以 ASCII 编码的字符串来呈现,可以应用在电子邮件传输之类的应用。
示例:
+AGg-e+AGwAbABvACAAdwBvAHIAbA-d+ACE-
5 URL 字符编码
URL 编码会将字符转换为可通过因特网传输的格式。URL 只能使用 ASCII 字符集
进行发送。由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
URL 编码使用 “%” 其后跟随两位的十六进制数来替换非 ASCII 字符。
URL 不能包含空格。URL 编码通常使用 + 来替换空格。
6 Base64 编码
6.1 Base64 编码的特点:
- 便于网络传输。
- 不可见性。
6.2 Base64 编码的作用
Base64 就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。而且 base64 特别适合在 http、mime 协议下快速传输数据。
Base64 作用场景:
-
将二进制的数据编码成文本格式:使用SMTP协议 (Simple Mail Transfer Protocol 简单邮件传输协议)来发送邮件。因为这个协议是基于文本的协议,所以如果邮件中包含一幅图片,我们知道图片的存储格式是二进制数据(binary data),而非文本格式,我们必须使用Base 64 Encoding将二进制的数据编码成文本格式。
-
若一个xml当中包含另一个xml数据,此时如果将 xml 数据直接写入显然不合适,将 xml 进行适当编码再存入,事实上xml当中的字符一般都是可见字符(0-127之间),但是由于中文的存在,可能存在不可见字符,直接将字符打印在外层xml的数据中显然不合理,可以使用 base64 对中文进行编码,然后存入xml,解码反之,其实还有个办法,将byte的值写在xml当中,空格或者,分开,这样也可以将byte数据传入,不过这样更浪费空间,并且不易保存.
-
http协议当中的key value字段,必须进行URLEncode 不然出现的等号可能使解析失败,空格也会使http请求解析出现问题,比如请求行就是以空格来划分的。
-
有些文本协议不支持不可见字符的传递,只能用大于32的可见字符来传递信息(协议规定)
使用Base64 编码原因: 我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
7 JSON 编码
**JSON:**一种与开发语言无关的、轻量级的数据存储格式,全称JavaScript Object Notation,一种数据格式的标准规范,起初来源于JavaScript这门语言,后来随着使用的广泛,几乎每门开发语言都有处理JSON的API。
优点:易于人的阅读和编写,易于程序解析与生产。
JSON格式:首先一个花括号{},整个代表一个对象,同时里面是一种Key-Value的存储形式,它还有不同的数据类型来区分:
数据结构:Object、Array
基本类型:string,number,true,false,null
(1)Object
{key:value,key:value...}
key:string类型
value:任何基本类型或数据结构
(2)Array
[value,value...]
value:任何基本类型或数据结构。
比如:{"name":"user01", "values":[1,2,3,"hellow"], "gender":{"male":"男","female":"女"} }
8 序列化
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
9 编码转换
- 编码转换测试网站: web2hack.org
- Python2 中,默认的编码为ASCII码
- Python3 中,默认的字符编码为Unicode
- 不同编码之间的转换需要先将字符编码decode转换成Unicode,再encode转换为想要的编码
- unicode 分为 utf-32(占4个字节),utf-16(占两个字节)[最常用],utf-8(占1-4个字节),不过在文件里存的还是utf-8,因为utf8省空间
- 在Python3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
import sys
print(sys.getdefaultencoding())
default_code = "你好!"
gbk_code = default_code.encode("gbk")
gbk_2_utf8_code = gbk_code.decode("gbk").encode("utf-8")
print("default_code", default_code)
print("gbk_code", gbk_code)
print("gbk_2_utf8_code", gbk_2_utf8_code.decode("utf-8"))
# 若修改编译器的输出编码格式为GBK,再编译此程序会报错:SyntaxError: Non-UTF-8 code starting with '\xd3' in...
# 由于Python本身的数据类型为Unicode,此时文件编码default_code还是unicode, 需要在文件头声明程序为GBK
# -*- coding: GBK -*-