Python Unicode 编码错误序数不在范围<128> 中,带有欧元符号

Posted

技术标签:

【中文标题】Python Unicode 编码错误序数不在范围<128> 中,带有欧元符号【英文标题】:Python Unicode Encode Error ordinal not in range<128> with Euro Sign 【发布时间】:2013-02-20 16:11:28 【问题描述】:

我必须在 Python 中读取一个 XML 文件并获取各种东西,然后我遇到了一个令人沮丧的 Unicode 编码错误错误,即使使用谷歌搜索我也无法弄清楚。

这是我的代码的 sn-ps:

#!/usr/bin/python
# coding: utf-8
from xml.dom.minidom import parseString
with open('data.txt','w') as fout:
   #do a lot of stuff
   nameObj = data.getElementsByTagName('name')[0]
   name = nameObj.childNodes[0].nodeValue
   #... do more stuff
   fout.write(','.join((name,bunch of other stuff))

当我正在解析的名称条目包含欧元符号时,这会严重崩溃。这是错误:

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

我明白为什么欧元符号会搞砸(因为它是 128,对吗?),但我认为 #coding: utf-8 会解决这个问题。我还尝试添加 .encode(utf-8) 以便名称看起来像

name = nameObj.childNodes[0].nodeValue.encode(utf-8)

但这也不起作用。我究竟做错了什么? (如果有人想知道,我正在使用 Python 2.7.3)

编辑:Python 在 fout.write() 行上崩溃——它会在 name 字段像这样的地方正常运行:

<name>United States, USD</name>

但会在以下名称字段上废话:

<name>France, € </name>

【问题讨论】:

异常在哪里生成?你能显示完整的回溯吗? fout.write() 行是它的废话。错误就在那里——它崩溃的名称 obj 我将在其中进行编辑。 【参考方案1】:

当您在 python 中使用open 内置函数打开文件时,您将始终以 ascii 格式读取文件。要以其他编码访问它,您必须使用编解码器:

import codecs
fout = codecs.open('data.txt','w','utf-8')

【讨论】:

对于 2.x 文件,您读取的是一串字节——没有特定的编码。字节不知道它们是 ASCII 字节还是 UTF-8 字节。如果您将 unicode 对象写入文件,它会使用默认的 ASCII 编码进行编码,这可能会失败。这就是codecs.open 发挥作用的地方。它添加了一个包装器,用于处理与 Unicode 和字节之间的编码。 这可能是比我更好的答案,因为它可以让您专门处理 Unicode 数据(让 IO 代码担心字符编码)。你也可以在 Python 2.7 中使用io.open,它也接受一个编码参数。这是 Python 3 中的默认 open【参考方案2】:

看起来您正在从 XML 解析器获取 Unicode 数据,但在写出之前您没有对其进行编码。您可以在将结果写入文件之前对其进行显式编码:

text = ",".join(stuff) # this will be unicode if any value in stuff is unicode
encoded = text.encode("utf-8") # or use whatever encoding you prefer
fout.write(encoded)

【讨论】:

以上是关于Python Unicode 编码错误序数不在范围<128> 中,带有欧元符号的主要内容,如果未能解决你的问题,请参考以下文章

编码给出“'ascii'编解码器无法编码字符......序数不在范围内(128)”

Django Python UnicodeDecodeError 序数不在范围内(128)

管理页面上的 django unicode 错误

subprocess.run()参数编码

UnicodeEncodeError:'ascii' 编解码器无法在位置 0 编码字符 u'\xef':序数不在范围内(128)

UnicodeEncodeError:“ascii”编解码器无法在位置 126 编码字符 u'\u2019':序数不在范围内(128)