u'\ufeff' in Python string 在Python字符串中的u'\ufeff'
在Python中遇到这个问题是因为Python 3支持在打开文件时使用encoding关键字来自动处理编码。如果没有指定encoding,则BOM会包含在读取的结果中。通过指定正确的编码,结果中的BOM会被省略。
解决方法是在打开文件时使用encoding参数,并设置为'utf-8-sig'。
以下是在Python 3中的示例代码:
f = open('file', mode='r', encoding='utf-8-sig') f.read()
这样就可以正确地读取文件内容,而不会出现BOM。
此外,一些用户在处理保存自Excel的CSV文件时也遇到了类似的问题。这是因为Excel生成的CSV文件中可能包含BOM。
希望这个解决方法对你有帮助!
在Python字符串中出现(u'\ufeff')的原因是Unicode字符U+FEFF是字节顺序标记(BOM),用于区分大端和小端的UTF-16编码。如果你使用正确的编解码器对网页进行解码,Python会自动删除它。下面是一些示例:
#!python2 #coding: utf8 u = u'ABC' e8 = u.encode('utf-8') # 不带BOM的编码 e8s = u.encode('utf-8-sig') # 带BOM的编码 e16 = u.encode('utf-16') # 带BOM的编码 e16le = u.encode('utf-16le') # 不带BOM的编码 e16be = u.encode('utf-16be') # 不带BOM的编码 print 'utf-8 %r' % e8 print 'utf-8-sig %r' % e8s print 'utf-16 %r' % e16 print 'utf-16le %r' % e16le print 'utf-16be %r' % e16be print print 'utf-8 w/ BOM decoded with utf-8 %r' % e8s.decode('utf-8') print 'utf-8 w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig') print 'utf-16 w/ BOM decoded with utf-16 %r' % e16.decode('utf-16') print 'utf-16 w/ BOM decoded with utf-16le %r' % e16.decode('utf-16le')
注意,EF BB BF是UTF-8编码的BOM。这在UTF-8中并不是必需的,而只是作为一个签名(通常在Windows系统中使用)。
输出结果如下:
utf-8 'ABC' utf-8-sig '\xef\xbb\xbfABC' utf-16 '\xff\xfeA\x00B\x00C\x00' # 添加BOM并使用本机处理器的字节顺序编码 utf-16le 'A\x00B\x00C\x00' utf-16be '\x00A\x00B\x00C' utf-8 w/ BOM decoded with utf-8 u'\ufeffABC' # 如果存在BOM,则不会删除BOM utf-8 w/ BOM decoded with utf-8-sig u'ABC' # 如果存在BOM,则会删除BOM utf-16 w/ BOM decoded with utf-16 u'ABC' # 必须存在BOM utf-16 w/ BOM decoded with utf-16le u'\ufeffABC' # 如果存在BOM,则不会删除BOM
需要注意的是,utf-16编解码器要求必须存在BOM,否则Python无法确定数据是大端还是小端。
参考链接:[unicode.org/faq/utf_bom.html#bom6](https://www.unicode.org/faq/utf_bom.html#bom6)