Python中Unicode 带BOM的处理

在处理csv文件的时候碰到一个很奇怪的问题,原本很正常的代码不知道除了什么鬼问题,从csv文件中读出了一个字符串,用print打印出来的字符完全一样:

1
2
3
4
5
6
>>> print '\xef\xbb\xbf\xe6\x9d\xa1\xe7\xa0\x81'
条码
>>> print u'条码'
条码
>>> print '\xef\xbb\xbf\xe6\x9d\xa1\xe7\xa0\x81' == u'条码'
False

什么鬼,居然不相等。用unicode解码后,发现了问题所在:

1
2
3
4
>>> '\xef\xbb\xbf\xe6\x9d\xa1\xe7\xa0\x81'.decode('utf8')
u'\ufeff\u6761\u7801'
>>> u'条码'.decode('utf8')
u'\u6761\u7801

多出来的ufeff是什么鬼?!
google之后,原来是叫 byte order mark的东西,简称BOM,貌似是用来标识文本文档格式的东西,详见知乎. 原来是这个鬼东西在作祟,知道问题的原因,怎么收拾它就很简单了,在str后解码一下位unicode without bom的格式即可,一行代码解决问题:

1
s.decode("utf-8-sig")