Python 写入文件时出现UnicodeError

Python 写入文件时出现UnicodeError,python,unicode,beautifulsoup,Python,Unicode,Beautifulsoup,我正在尝试向文件中写入一些字符串(这些字符串是由HTML解析器BeautifulSoup提供给我的) 我可以使用“打印”来显示它们,但当我使用file.write()时,会出现以下错误: UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128) 如何解析此内容?将包含非英语字符(超过128个Unicode字符)的Unicode字符串传递给需要

我正在尝试向文件中写入一些字符串(这些字符串是由HTML解析器BeautifulSoup提供给我的)

我可以使用“打印”来显示它们,但当我使用file.write()时,会出现以下错误:

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

如何解析此内容?

将包含非英语字符(超过128个Unicode字符)的Unicode字符串传递给需要ASCII bytestring的对象时,会发生此错误。Python bytestring的默认编码是ASCII,“它精确地处理128个(英文)字符”。这就是为什么试图转换超过128的Unicode字符会产生错误

unicode()

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

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

比如说

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


将使用拉丁语-1编码如果我在谷歌中输入“python unicode”,我会得到大约1400万个结果;第一个是非常详细地描述了整个情况;第四个是一个可以给你一个答案,也可以确保你理解发生了什么

你真的需要阅读和理解这些概述,不管它们看起来有多长。真的没有办法绕过它。文本是硬的。没有“纯文本”这样的东西,多年来没有一个合理的传真,也从来没有真正的传真,尽管我们花了几十年的时间假装有。但Unicode至少是一种标准


您还应该阅读。

您的问题的答案是“使用编解码器”。附带的代码还显示了一些gettext魔法,FWIW

尽管谷歌在这个问题上的点击率很高,但我发现很难找到这个简单的解决方案(它实际上是在Python文档中关于Unicode的,但有点隐晦)

所以。。。嗯


GaJ

它输出的字符串是一个类似于“123英镑”的价格,这是无效的ASCII码。磅符号是字符代码163,超出了127的ASCII范围。您必须指定可以对这些字符进行编码的编码。文件不包含字符;它们包含字节。编码将字符转换为字节。是的,当我说“你必须这样做”时,我完全理解你还没有这样做。这就是为什么你必须这么做:去解决你描述的问题
write()
不“理解Unicode”,因为(a)文件不包含字符,而是包含字节;(b)编码的方法不止一种,也没有特别好的方法供它代表您选择。事实上,它是这样做的:它选择了最简单的编码,只处理每个人都同意的少数字符,因此如果需要任何特殊的东西,就会出现错误。“简单”?这也展示了OP不关心的一系列i18n机器——他不是试图确保人们看到正确语言的文本,而是试图从特定的源中获取特定语言的文本并将其放入文件中。所以你剪下的唯一相关部分是第一行和最后两行,真的。至于“难找”,真的吗?你用谷歌搜索什么?我尝试了UnicodeEncodeError:“ascii”编解码器无法对字符进行编码;结果似乎很有帮助。。。
s = u'La Pe\xf1a' 
print s.encode('latin-1')
write(s.encode('latin-1'))
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')