了解python文件编码流程
python里的字符串str其实是字节串,它是unicode经过编码后的字节组成的序列。对str1 = “汉”,进行print(len(str1.encode(“utf-8”)))后的结果是3,因为实际上,UTF-8编码的’汉’ == ‘\xE6\xB1\x89’。所以说,事实上的字符串其实是unicode编码后的字节串。
str1 = "测"
print(len(str1.encode("utf-8")))
### 结果为3
所以在日常中,解码的其实是:
其他编码(UTF-8, gbk) --> unicode;
同样的编码流程是:
其他编码(UTF-8, gbk) <-- unicode;
所以,对unicode进行解码是错误的,同样的对utf-8与gbk格式的字符串(注意我这里说的是转换为utf-8和gbk形式的字符串)进行编码也是错误的。
文件中的非法字符导致的编码出错
有些时候编码搞对了,可是遇到了非法字符。比方产生字符串的来源错误发生。引入了错误值等,这时再次遇到异常
比如:全角空格往往有多种不同的实现方式。比方\xa3\xa0,或者\xa4\x57,
这些字符。看起来都是全角空格。但它们并非“合法”的全角空格。
真正的全角空格是\xa1\xa1,因此在转码的过程中出现了异常。
而之前在处理新浪微博数据时。遇到了非法空格问题导致无法正确解析数据。
解决的方法:
将获取的字符串strTxt做decode时。指明ignore。会忽略非法字符,
当然对于gbk等编码,处理相同问题的方法是类似的
strTest = strTxt.decode(‘utf-8’, ‘ignore’)
return strTest
1、默认的參数就是strict,代表遇到非法字符时抛出异常;
2、假设设置为ignore。则会忽略非法字符;
3、假设设置为replace。则会用?号代替非法字符;
4、假设设置为xmlcharrefreplace,则使用XML的字符引用。
某些软件(如notepad)在文件编辑后会在开头插入三个看不见的字符导致编码出错
此时,我们需要自行的去删除这些字符,然后再进行编码。
删除前:
# coding=gbk
import codecs
print open("Test.txt").read().decode("utf-8")
结果:abc中文
上面的test.txt是用Editplus来编辑的。但当我用Windows自带的记事本编辑并存成UTF-8格式时,
执行时报错:
Traceback (most recent call last):
File "ChineseTest.py", line 3, in
print open("Test.txt").read().decode("utf-8")
UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence
某些软件,如notepad。在保存一个以UTF-8编码的文件时,
会在文件開始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
删除后:
# coding=gbk
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")
结果:abc中文