Python编码错误


了解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中文
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值