我对编解码器真的很困惑。打开功能。当我这样做的时候:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
它给出了误差
UnicodeDecodeError: 'ascii'编解码器不能解码字节0xef位置
0:序数不在范围(128)
如果我这样做:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
它工作得很好。
问题是为什么第一种方法失败了?如何插入bom?
如果第二种方法是正确的方法,那么使用编解码器有什么意义呢?打开(文件名,"w", "utf-8")?
@S-Lott给出了正确的过程,但在Unicode问题上展开,Python解释器可以提供更多的见解。
Jon Skeet对codecs模块的看法是正确的(不寻常)——它包含字节字符串:
>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>>
选择另一个nit, BOM有一个标准的Unicode名称,它可以输入为:
>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'
它也可以通过unicodedata访问:
>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>>
@S-Lott给出了正确的过程,但在Unicode问题上展开,Python解释器可以提供更多的见解。
Jon Skeet对codecs模块的看法是正确的(不寻常)——它包含字节字符串:
>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>>
选择另一个nit, BOM有一个标准的Unicode名称,它可以输入为:
>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'
它也可以通过unicodedata访问:
>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>>