python基础之:字符编码

前言

编码(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;
显示内容描述实体名称(大小写敏感)实体编号
空格&nbsp;&#160;
<小于号&lt;&#60;
>大于号&gt;&#62;
&和号&amp;&#38;
"引号&quot;&#34;
撇号&apos; (IE不支持)&#39;
分(cent)&cent;&#162;
£镑(pound)&pound;&#163;
¥元(yen)&yen;&#165;
欧元(euro)&euro;&#8364;
§小节&sect;&#167;
©版权(copyright)&copy;&#169;
®注册商标&reg;&#174;
商标&trade;&#8482;
×乘号&times;&#215;
÷除号&divide;&#247;

3.1不间断空格(non-breaking space)

浏览器总是会截短 HTML 页面中的空格。如果您在文本中写 3 个空格,在显示该页面之前,浏览器会删除它们中的 2 个。如需在页面中增加空格的数量,您需要使用 &nbsp; 字符实体。

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 编码的特点:

  1. 便于网络传输。
  2. 不可见性。

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,truefalsenull1)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 -*-
posted @ 2020-05-11 11:45  f_carey  阅读(15)  评论(0编辑  收藏  举报  来源