python编码

了解python编码

资料来源:

https://www.tr0y.wang/2018/09/13/py-coding-type/

各字符编码功能介绍 

ASCII码主要是为了处理英文字符

GB2312主要是处理中文字符

unicode主要是为了处理各国字符

UTF-8提高了unicode存储和传输性能,它是unicode的一种表现形式

创造str和unicode

 直接创造str和unicode

str => unicode,unicode => str

python提供了 decode/encode 用于两者的转换

    1)str -> decode('某种编码') -> unicode

    2)  unicode -> encode('某种编码') -> str

  总结:unicode经过编码后形成str,str编码后形成unicode

  注:unicode是一种字符集,不属于编码,其它编码是具体实现unicode思想的一种编码,所以str到unicode的转换称为解码,而unicode到str的转换称为编码

环境编码

系统默认编码   1)linux,unix:utf-8     2)windows:gbk2312

编辑器编码

可以自由设置,最好统一为UTF-8

文件头部编码声明

声明编码方式为:# -*- coding: utf-8 -*- 或 #coding=utf-8(今天才知,-*-仅仅是为了好看),utf-8、utf8,python都能识别

注:声明放在第一行,代码中直接声明的字符串编码类型,与头部声明编码方式直接相关,为避免乱码和后续处理,建议统一为utf-8

编码之间的转换

需要用unicode搭桥。str有各种编码的区别,unicode是没有编码的标准形式

 python2.x和python3.x的编码方式

  python2.x默认使用ascii编码,python3.x默认使用utf-8编码,

  python2中,str编码后的结果是bytes,str = bytes, 所以s只能decode

  python3.x的编码方式是:

          文本总是 Unicode,由 str 类型表示,二进制数据则由 bytes 类型表示。Python 3 不会以任意隐式的方式混用 str 和 bytes

   解释:首先,Unicode 是内存编码表示方案(是规范),而 UTF 是如何保存和传输 Unicode 的方案(是实现)。 这也是 UTF 与 Unicode 的区别。py3.X 中只有一种能保存文本信息的数据类型:str,不可变,保存的是 Unicode 码位。Unicode 是离用户更近的数据,bytes 是离计算机更近的数据

   变化: str 表示的概念都是字符串类型,只不过 Py2.x 的 str 是经过编码的 unicode,而 py3.x 的 str 就是 unicode。 那么,py3.x 的 unicode 经过编码后,是什么呢?就是 bytes。也就是说,py3.x 的字符串默认是 unicode,至于你想把它怎么编码(utf8 或者 gbk),都是你自己的事。

#python2.x                                 #python3.x

字符串:str类型                              字符串:unicode 类型
type("123") :str                           type("123"): str
len(""):3                                len("我"):1
len("".decode("utf-8")) : 1               len("我".encode()) : 3

  

python3.x编码示例

a = "" # a 是一个 字符串,类型是 str,用 unicode 表达
print(a) # '我'
a = b'xe6x88x91' # a 是一个 字节流,类型是 bytes,用 utf8 编码的 unicode 表达 print(a) # b'xe6x88x91' a = "".encode("utf8") # 将 a 编码,转为用 utf8 编码的 unicode 表达 print(a) # b'xe6x88x91' a = b'xe6x88x91'.decode("utf8") # 将 a 解码,转为用 unicode 表达 print(a) # "我" a = "".decode("utf8") # 试图将 unicode 解码 # 报错:AttributeError: 'str' object has no attribute 'decode' a = b'xe6x88x91'.encode("utf8") # 试图将 bytes 编码 # 报错:AttributeError: 'bytes' object has no attribute 'encode' a = b'xe6x88x91'.decode("gbk") # 解码的编码类型与原有编码类型不匹配 # 报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 2: incomplete multibyte sequence
原文地址:https://www.cnblogs.com/lw-monster/p/11929339.html