即使一切都是 unicode(python 2.7),ascii 解码错误
Posted
技术标签:
【中文标题】即使一切都是 unicode(python 2.7),ascii 解码错误【英文标题】:ascii decode error even though everything being unicode ( python 2.7) 【发布时间】:2019-06-19 06:31:02 【问题描述】:我在数据流 (apache beam) 中运行一个脚本,它在 python 2.7.12 中运行,并使用 unicode 字符串进行一些文本处理。
在处理中,我执行以下操作,其中 noun 和 phrase 是 unicode(我认为...)
# -*- coding: utf-8 -*-
...
key = u"_".format(
noun, phrase.replace(u" ", u"_")
)
但是它会产生 ascii 解码错误
'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128)
我可以进行调试并获取用作 noun 和 phrase 的字符串的代表,但我目前没有它们,因为我的日志没有输出他们。
我不明白 ascii 解码错误,当我认为我非常明确我想要 unicode 中的所有内容时!
您能否提供一些提示,或者我应该返回有关输入字符串的更多信息?
【问题讨论】:
noun
和 phrase
是什么?听起来phrase
有字符0xe2
。在 latin1
中,这是一个 â
,它不是真正的 ascii 字符。
但是当我明确地创建一个 unicode 字符串 @FHTMitchell 时这有关系吗
是的——python只自动编码ascii
你如何创建名词和短语?
noun
或 phrase
或两者都不是 Unicode 字符串。 .decode()
他们首先使用正确的编解码器。 Python 2 将尝试自动将字节字符串解码为 Unicode 字符串,但将使用 ascii
编解码器。 Python 3 不会自动尝试,所以你会立即发现错误,即使字符串是 ASCII-only。
【参考方案1】:
好的,所以你的字符串中有一个非 ascii 字符。需要将phrase
直接转成unicode
phrase.decode('latin-1')
在unicode.format
进行操作之前
【讨论】:
【参考方案2】:一位同事提醒我,我总是可以将整个输出解码,在这种情况下,这是我选择的任何格式的关键。
key = u"___".format(
business_unit_id, date, noun, phrase.replace(u" ", u"_")
).encode('ascii', 'ignore')
在这种情况下,我想要 ascii 输出,而不关心缺少像?这样的字符。
如果我想要 unicode 格式的输出,我也可以使用 ...).encode('utf-8')
。
在我的情况下,我使用 ascii 输出解决了问题,因为 apache Beam 中的管道似乎对其映射减少管道中的 unicode 键不满意
【讨论】:
以上是关于即使一切都是 unicode(python 2.7),ascii 解码错误的主要内容,如果未能解决你的问题,请参考以下文章
在Windows上的python 2.7中列出具有Unicode名称的文件
有效地将字符串转换为 python 2.7 的 unicode
Python 2.7:如何将字符串中的 unicode 转义转换为实际的 utf-8 字符
由于系统 Python 2.7 的要求,Pygame 安装失败,即使我有 Python 2.7