我与codecs.open function真的很困惑。当我做:

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()

它工作正常。

<强>问题是为什么第一方法失败?我如何将材料明细表?

如果第二方法是做它的正确的方法,使用什么codecs.open(filename, "w", "utf-8")点?

有帮助吗?

解决方案

我相信问题是, codecs.BOM_UTF8 是一个字节串,不是一个Unicode字符串。我怀疑文件处理程序试图猜测你基于真正的意思是“我的意思被写为Unicode的UTF-8编码的文本,但你给了我一个字节串!”

尝试写入Unicode字符串的字节顺序标记(即Unicode的U + FEFF)直接,以使文件刚刚编码为UTF-8:

import codecs

file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()

(这似乎得到正确的答案 - 与字节EF BB BF的文件)

编辑:使用“UTF-8-SIG”作为编码是一个比一个更好的S.洛特的建议明确自己写的BOM,但因为它解释了什么是错之前打算在这里我要离开这个答案。

其他提示

阅读以下: http://docs.python.org/库/ codecs.html#模块encodings.utf_8_sig

执行此

with codecs.open("test_output", "w", "utf-8-sig") as temp:
    temp.write("hi mom\n")
    temp.write(u"This has ♭")

将得到的文件是UTF-8与预期BOM。

@ S-洛特给出正确的程序,但扩大对的的Unicode 的问题时,的的Python 的解释可以提供更多的见解。

乔恩斯基特是右(异常)有关 codecs 模块 - 它包含字节串:

>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>> 

采摘另一个尼特,所述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'
>>> 

我使用的文件的* nix命令到一个未知的字符集转换文件在UTF-8文件

# -*- encoding: utf-8 -*-

# converting a unknown formatting file in utf-8

import codecs
import commands

file_location = "jumper.sub"
file_encoding = commands.getoutput('file -b --mime-encoding %s' % file_location)

file_stream = codecs.open(file_location, 'r', file_encoding)
file_output = codecs.open(file_location+"b", 'w', 'utf-8')

for l in file_stream:
    file_output.write(l)

file_stream.close()
file_output.close()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top