UnicodeDecodeError:将类型字符串转换为unicode

时间:2014-06-24 16:28:34

标签: python python-2.7 unicode

我正在尝试替换文字。不幸的是,主字符串存储为unicode类型,但描述要替换的文本的字符串存储为类型字符串。以下是一个可重复的例子:

mystring = u'Bunch of text with non-standard character in the name Rubén'
old = 'Rubén'
new = u'newtext'
mystring.replace(old, new)

这会引发错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)

当我尝试使用oldunicode(old)转换为unicode时出现同样的错误。几个答案解决了特定字符的问题,但我找不到通用解决方案。

1 个答案:

答案 0 :(得分:1)

您需要使用显式编解码器将old值转换为Unicode。该编解码器完全取决于您采购old的方式。

如果它是源代码中的字符串文字,请使用源代码编码。除非您在评论的顶部指定了有效的编解码器,否则Python不会接受您的源文件;见PEP 263

old定义粘贴到终端将使用终端编解码器(终端在粘贴时发送Python编码的字节)。

如果数据来自其他任何地方,您需要确定该来源的编码。例如,对于HTTP数据,请检查Content-Type标头中的charset参数。

然后解码:

old = old.decode(encoding)

如果在没有显式编解码器的情况下使用unicode(old),或者尝试在unicode.replace()中使用bytestring,Python将使用默认编解码器ASCII。

在我的终端中进行演示,配置为使用UTF-8:

>>> import sys
>>> sys.stdin.encoding  # reflects the detected terminal codec
'UTF-8'
>>> old = 'Rubén'
>>> old  # shows encoded data in python string literal form
'Rub\xc3\xa9n'
>>> old.decode('utf8')  # unicode string literal form
u'Rub\xe9n'
>>> print old.decode('utf8')  # string value written to the terminal
Rubén
>>> mystring = u'Bunch of text with non-standard character in the name Rubén'
>>> new = u'newtext'
>>> mystring.replace(old, new)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)
>>> mystring.replace(old.decode('utf8'), new)
u'Bunch of text with non-standard character in the name newtext'

一般来说,你想早点解码,晚编码;使您的数据流成为Unicode三明治。只要您收到文本,请将其全部解码为Unicode值,并且不要再次编码,直到数据离开您的程序。