Sau*_*aul 14 python unicode io utf-8 character-encoding
出于某种原因,当从UTF-8文件中读取unicode字符串时,Python似乎遇到了BOM问题.考虑以下:
with open('test.py') as f:
for line in f:
print unicode(line, 'utf-8')
Run Code Online (Sandbox Code Playgroud)
看起来很直白,不是吗?
这是我的想法,直到我从命令行运行它并获得:
UnicodeEncodeError:'charmap'编解码器无法对位置0中的字符u'\ ufeff'进行编码:字符映射到
<undefined>
对Google的简短访问显示,必须手动清除 BOM :
import codecs
with open('test.py') as f:
for line in f:
print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')
Run Code Online (Sandbox Code Playgroud)
这个运行正常.但是我很难看到这方面的任何优点.
上述行为背后有理由吗?相比之下,UTF-16无缝工作.
Jos*_*Lee 28
该'utf-8-sig'编码将消耗代表您的BOM签名.
tch*_*ist 13
你写了:
Run Code Online (Sandbox Code Playgroud)UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to <undefined>
当你"utf-8"在Python中指定编码时,它会引导你.UTF-8文件不应包含BOM.它们既不是必需也不是推荐.对于8位代码单元,字节顺序没有意义.
BOM也搞砸了,因为你不能再做了:
$ cat a b c > abc
Run Code Online (Sandbox Code Playgroud)
如果这些UTF-8文件中包含无关(读取:任何)BOM.现在看看为什么BOMs在UTF-8中如此愚蠢/糟糕/有害?他们实际上打破了一切
BOM是元数据,而不是数据,UTF-8编码规范不像UTF-16和UTF-32规范那样允许它们.所以Python带你到你的话,遵循规范.很难为此归咎于此.
如果您尝试使用BOM作为文件类型幻数来指定文件的内容,那么您实际上不应该这样做.您应该使用更高级别的prototocl来实现这些元数据,就像使用MIME类型一样.
这只是另一个蹩脚的Windows错误,其解决方法是使用备用编码"utf-8-sig"传递给Python.
| 归档时间: |
|
| 查看次数: |
8380 次 |
| 最近记录: |