84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
0x92 即 10010010,UTF8 中编码一个字符的第一个字节(start byte)只可能是 0xxxxxxx、110xxxxx、1110xxx、11110xxx……而后面的字节只可能是 10xxxxxx。也就是说 0x92 只能作为后面的字节,却出现在了第一个字节的位置。
0x92
10010010
0xxxxxxx
110xxxxx
1110xxx
11110xxx
10xxxxxx
出现这种问题绝大部分情况是因为文件不是 UTF8 编码的(例如,可能是 GBK 编码的),而系统默认采用 UTF8 解码。解决方法是改为对应的解码方式。
极少数情况是因为文件损坏了或者和一部分非 UTF8 编码混在一起,可以修复文件或采用 replace 等方式解码。
replace
Python 2 没有问题是因为 Python 2 默认以字节流(对应 Python 3 的 bytes)的方式读文件,不像 Python 3 默认解码为 unicode,把读文件的方式改为 rb 有同样的效果,不过 Python 3 中处理 bytes 还可能遇到很多问题就是了……
bytes
unicode
rb
0x92
即10010010
,UTF8 中编码一个字符的第一个字节(start byte)只可能是0xxxxxxx
、110xxxxx
、1110xxx
、11110xxx
……而后面的字节只可能是10xxxxxx
。也就是说0x92
只能作为后面的字节,却出现在了第一个字节的位置。出现这种问题绝大部分情况是因为文件不是 UTF8 编码的(例如,可能是 GBK 编码的),而系统默认采用 UTF8 解码。解决方法是改为对应的解码方式。
极少数情况是因为文件损坏了或者和一部分非 UTF8 编码混在一起,可以修复文件或采用
replace
等方式解码。Python 2 没有问题是因为 Python 2 默认以字节流(对应 Python 3 的
bytes
)的方式读文件,不像 Python 3 默认解码为unicode
,把读文件的方式改为rb
有同样的效果,不过 Python 3 中处理bytes
还可能遇到很多问题就是了……