编码问题

什么是编码

ASCII

一种编码规范

8位的二进制编码 0 - 127

Unicode和Utf-8

能够编码任意的符号
unicode编码,范围虫0x0000到0x10FFFF
unicdode至规定了编号,但是并未规定如何存储

utf32

使用32位来存储unicode编码后数字对应的二进制

utf16

UTF-16 使用变长字节表示

① 对于编号在 U+0000 到 U+FFFF 的字符(常用字符集),直接用两个字节表示。
② 编号在 U+10000 到 U+10FFFF 之间的字符,需要用四个字节表示。

同样,UTF-16 也有字节的顺序问题(大小端),所以就有 UTF-16BE 表示大端,UTF-16LE 表示小端。

utf8

UTF-8 就是使用变长字节表示,顾名思义,就是使用的字节数可变,这个变化是根据 Unicode 编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多。使用的字节个数从 1 到 4 个不等。

UTF-8 的编码规则是:

① 对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码,因此对于英文字母,UTF-8 编码和 ASCII 码是相同的。

② 对于n字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。

举个例子:比如说一个字符的 Unicode 编码是 130,显然按照 UTF-8 的规则一个字节是表示不了它(因为如果是一个字节的话前面的一位必须是 0),所以需要两个字节(n = 2)。

根据规则,第一个字节的前 2 位都设为 1,第 3(2+1) 位设为 0,则第一个字节为:110X XXXX,后面字节的前两位一律设为 10,后面只剩下一个字节,所以后面的字节为:10XX XXXX。

所以它的格式为 110XXXXX 10XXXXXX 。

py编码

文件编码

py在编译文件的时候,需要提供文件的编码格式

IO编码

IO处理的时候

python2里的unicode和

1
2
3
4
5
> object
>> basestring
>>> str
>>> --
>>> unicode
  • str对象支持的方法与unicode基本完全一样
  • str与unicode都是继承自basestring,大部分对字符串操作的方法只会检查是不是basestring类及+ 其子类
    任何一个类都来自object(这里指新类),都默认包含内建方法str,该方法用于将实例转换成str对象,换言之,你能够print任何一个对象,都因为默认使用内建方法转换了。各个类都可以改写这个内建方法,而unicode改写为使用默认编码解码

另外一种稍微可以谅解的情况是,python2关于文件流的封装实在太过坑爹,基本上所有文件流最终返回和写入的都是str对象。简单的举个例子,你打开一个文件,按行读取的每一行,都是一个str对象!
这种情况,就是为什么需要设置

1
2
3
import sys
reload(sys)
sys.setdefaultencoding('utf8')

这种方法是在饮鸩止渴,完全没有解决你的实际代码问题。它只是将python默认编码替换成了你想要的编码(utf-8之类),一旦有新的编码类型的str对象出现,你的程序就会重新开始报错。所以不推荐这种方法,它会掩盖掉你程序的大部分问题。

decode 和 encode

encode:编码,将特定的字符串转换成str
decode:解码,将特定编码的str转换成unicode

引用

https://blog.csdn.net/zhusongziye/article/details/84261211
http://python.jobbole.com/86564/

坚持技术分享,您的支持将鼓励我继续创作!