Python,将输出编码为UTF-8

Raz*_*zle 5 python encoding utf-8 python-2.7

我有一个定义,构建一个由UTF-8编码字符组成的字符串.输出文件使用'w+', "utf-8"参数打开.

但是,当我试着x.write(string)去拿UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 1: ordinal not in range(128)

我认为这是因为通常你会做`print(u'something').但我需要使用一个变量和U中的语录" _ "否定的是...

有什么建议?

编辑:这里的实际代码:

source = codecs.open("actionbreak/" + target + '.csv','r', "utf-8")
outTarget = codecs.open("actionbreak/" + newTarget, 'w+', "utf-8")
x = str(actionT(splitList[0], splitList[1]))
outTarget.write(x)
Run Code Online (Sandbox Code Playgroud)

基本上所有这一切应该是为我构建大量类似于此的字符串:

[??? Deliverables]= CASE WHEN things = 11 THEN C ELSE 0 END

JAB*_*JAB 5

你在用codecs.open()吗?Python 2.7的内置open()功能不支持特定的编码,这意味着您必须手动编码非ascii字符串(正如其他人已经注意到的那样),但codecs.open()确实支持它,并且可能比手动编码所有字符串更容易.


正如您实际使用的那样codecs.open(),通过添加的代码,经过一些自我查找后,我建议尝试使用编码打开输入和/或输出文件"utf-8-sig",这将自动处理UTF-8的BOM(请参阅http ://docs.python.org/2/library/codecs.html#encodings-and-unicode,靠近该部分的底部)我认为这只对输入文件有用,但如果没有这些组合(utf) -8-sig/utf-8,utf-8/utf-8-sig,utf-8-sig/utf-8-sig)工作,然后我相信最可能的情况是你的输入文件被编码为不同的Unicode格式与BOM,因为Python的默认UTF-8编解码器将BOM解释为常规字符,因此输入不会有问题,但输出可以.


刚注意到这一点,但是...当你使用时codecs.open(),它需要一个Unicode字符串,而不是一个编码的字符串; 试试x = unicode(actionT(splitList[0], splitList[1])).

尝试解码unicode字符串时也会出现错误(请参阅http://wiki.python.org/moin/UnicodeEncodeError),但我不认为应该发生这种情况,除非actionT()你的列表拆分对Unicode做了什么导致它们被视为非Unicode字符串的字符串.


sta*_*alk 5

在python 2.x中有两种类型的字符串:字节字符串和unicode字符串.第一个包含字节,最后一个包含 - unicode代码点.很容易确定它是什么类型的字符串 - unicode字符串以u:

# byte string
>>> 'abc'
'abc'

# unicode string:
>>> u'abc ???'
u'abc \u0430\u0431\u0432'
Run Code Online (Sandbox Code Playgroud)

'abc'字符是相同的,因为它们在ASCII范围内.\u0430是一个unicode代码点,它超出了ASCII范围."代码点"是unicode点的python内部表示,它们无法保存到文件中.首先需要将它们编码为字节.这里编码的unicode字符串是怎样的(因为它被编码,它变成一个字节串):

>>> s = u'abc ???'
>>> s.encode('utf8')
'abc \xd0\xb0\xd0\xb1\xd0\xb2'
Run Code Online (Sandbox Code Playgroud)

现在可以将此编码的字符串写入文件:

>>> s = u'abc ???'
>>> with open('text.txt', 'w+') as f:
...     f.write(s.encode('utf8'))
Run Code Online (Sandbox Code Playgroud)

现在,重要的是要记住,我们在写入文件时使用了什么编码.因为能够读取数据,我们需要解码内容.这里有什么数据看起来没有解码:

>>> with open('text.txt', 'r') as f:
...     content = f.read()
>>> content
'abc \xd0\xb0\xd0\xb1\xd0\xb2'
Run Code Online (Sandbox Code Playgroud)

你看,我们有编码字节,与s.encode('utf8')完全相同.要解码,需要提供编码名称:

>>> content.decode('utf8')
u'abc \u0430\u0431\u0432'
Run Code Online (Sandbox Code Playgroud)

解码后,我们用unicode代码点取回了我们的unicode字符串.

>>> print content.decode('utf8')
abc ???
Run Code Online (Sandbox Code Playgroud)