u'\ ufeff'在Pythonstring中
我用下面的模式得到一个错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)
不知道u'\ufeff'
是什么,它显示当我在网上刮。 我该如何纠正这种情况? .replace()
string方法不起作用。
Unicode字符U+FEFF
是字节顺序标记或BOM,用于说明大小端UTF-16编码之间的区别。 如果您使用正确的编解码器解码网页,Python将为您删除它。 例子:
#!python2 #coding: utf8 u = u'ABC' e8 = u.encode('utf-8') # encode without BOM e8s = u.encode('utf-8-sig') # encode with BOM e16 = u.encode('utf-16') # encode with BOM e16le = u.encode('utf-16le') # encode without BOM e16be = u.encode('utf-16be') # encode without 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' # Adds BOM and encodes using native processor endian-ness. utf-16le 'A\x00B\x00C\x00' utf-16be '\x00A\x00B\x00C' utf-8 w/ BOM decoded with utf-8 u'\ufeffABC' # doesn't remove BOM if present. utf-8 w/ BOM decoded with utf-8-sig u'ABC' # removes BOM if present. utf-16 w/ BOM decoded with utf-16 u'ABC' # *requires* BOM to be present. utf-16 w/ BOM decoded with utf-16le u'\ufeffABC' # doesn't remove BOM if present.
请注意, utf-16
编码需要 BOM才能出现,否则Python不会知道数据是大还是小。
你正在刮的内容是用unicode而不是ascii文本编码的,而且你得到的字符不能转换成ascii。 正确的“翻译”取决于原始网页的想法。 Python的unicode页面介绍了它的工作原理。
你想打印结果还是将其粘贴到文件中? 错误表明它正在写入导致问题的数据,而不是读取它。 这个问题是寻找修复的好地方。
该字符是BOM或“字节顺序标记”。 它通常作为文件的前几个字节接收,告诉你如何解释其余数据的编码。 你可以简单地删除angular色继续。 虽然,因为错误说你正试图转换为“ascii”,你应该select另一种编码,无论你想要做什么。
这个问题基本上出现在你用UTF-8或UTF-16编码保存你的python代码时,因为python在代码的开头自动添加一些特殊字符(文本编辑器没有显示)来标识编码格式。 但是,当你尝试执行代码时,它会给你第1行的语法错误,即代码的开始,因为python编译器理解ASCII编码 。 当您使用read()函数查看文件的代码时,您可以在返回的代码的开头看到“\ ufeff” 。 解决这个问题的最简单的方法就是将编码改回ASCII编码 (为此,您可以将您的代码复制到记事本并保存。记住!selectASCII编码…希望这会有所帮助。
具体来说, feff
的字节顺序标记是utf-16编码的指示符。 由于utf-16的所有字节都很less使用,因此有两种不同的编码scheme供人们使用。 由于不同的编码基本上只是翻转utf-16中的字节,因此标准是字节顺序标记将永远是feff
。 这样,如果有人用字节顺序标记发送了一个字节顺序标记,则unicode编码器知道翻转下面文档中所有字节的顺序。