写入文件时的UnicodeEncodeError

时间:2011-08-04 10:20:46

标签: python unicode beautifulsoup

我正在尝试将一些字符串写入文件(HTML解析器BeautifulSoup已将字符串提供给我)。

我可以使用“print”来显示它们,但是当我使用file.write()时,我收到以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128)

我该如何解析这个?

3 个答案:

答案 0 :(得分:18)

是的,大约99.9%的资深Python用户以前见过它。

如果我在Google中键入'python unicode',我会得到大约1400万个结果;第一个是http://docs.python.org/howto/unicode.html官方文件,描述了令人难以忍受的细节的整个情况;第四个是http://farmdev.com/talks/unicode/,这是一个更实用的概述,几乎可以为你提供答案,并确保你了解正在发生的事情。

你真的需要阅读和理解这些概述,不管它们看起来多久。真的没有任何解决方法。文字很难。没有“纯文本”这样的东西,多年来没有合理的传真,而且从来没有真正存在过,尽管我们花费了数十年的假装。但Unicode至少是一种标准。

您还应该阅读http://www.joelonsoftware.com/articles/Unicode.html

答案 1 :(得分:13)

将包含非英语字符(Unicode字符超过128)的Unicode字符串传递给需要ASCII字节字符串的内容时,会发生此错误。 Python字节串的默认编码是ASCII,“它可以处理128个(英文)字符”。这就是为什么尝试将Unicode字符转换为128以上会产生错误。

unicode()

unicode(string[, encoding, errors])

构造函数具有签名unicode(string [,encoding,errors])。它的所有参数都应该是8位字符串。

使用指定的编码将第一个参数转换为Unicode; 如果您不使用编码参数,则ASCII编码用于转换,因此大于127的字符将被视为错误

例如

s = u'La Pe\xf1a' 
print s.encode('latin-1')

write(s.encode('latin-1'))

将使用latin-1进行编码

答案 2 :(得分:3)

您的问题的答案是“使用编解码器”。上传的代码也显示了一些gettext魔法,FWIW。 http://wiki.wxpython.org/Internationalization

import codecs

import gettext

localedir = './locale'
langid = wx.LANGUAGE_DEFAULT # use OS default; or use LANGUAGE_JAPANESE, etc.
domain = "MyApp"             
mylocale = wx.Locale(langid)
mylocale.AddCatalogLookupPathPrefix(localedir)
mylocale.AddCatalog(domain)

translater = gettext.translation(domain, localedir, 
                                 [mylocale.GetCanonicalName()], fallback = True)
translater.install(unicode = True)

# translater.install() installs the gettext _() translater function into our namespace...

msg = _("A message that gettext will translate, probably putting Unicode in here")

# use codecs.open() to convert Unicode strings to UTF8

Logfile = codecs.open(logfile_name, 'w', encoding='utf-8')

Logfile.write(msg + '\n')

尽管谷歌对此问题充满了热情,但我发现很难找到这个简单的解决方案(它实际上是关于Unicode的Python文档,而是相当繁琐)。

所以...... HTH ......

GAJ