什么是编码
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和
|
|
- str对象支持的方法与unicode基本完全一样
- str与unicode都是继承自basestring,大部分对字符串操作的方法只会检查是不是basestring类及+ 其子类
任何一个类都来自object(这里指新类),都默认包含内建方法str,该方法用于将实例转换成str对象,换言之,你能够print任何一个对象,都因为默认使用内建方法转换了。各个类都可以改写这个内建方法,而unicode改写为使用默认编码解码
另外一种稍微可以谅解的情况是,python2关于文件流的封装实在太过坑爹,基本上所有文件流最终返回和写入的都是str对象。简单的举个例子,你打开一个文件,按行读取的每一行,都是一个str对象!
这种情况,就是为什么需要设置
这种方法是在饮鸩止渴,完全没有解决你的实际代码问题。它只是将python默认编码替换成了你想要的编码(utf-8之类),一旦有新的编码类型的str对象出现,你的程序就会重新开始报错。所以不推荐这种方法,它会掩盖掉你程序的大部分问题。
decode 和 encode
encode:编码,将特定的字符串转换成str
decode:解码,将特定编码的str转换成unicode
引用
https://blog.csdn.net/zhusongziye/article/details/84261211
http://python.jobbole.com/86564/