我正在尝试替换文本。不幸的是,主字符串存储为unicode类型,但描述要替换的文本的字符串存储为string类型。以下是一个可复制的示例:
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)
当我试图用unicode(old)
将old
转换为unicode时,也会遇到同样的错误。有几个答案可以解决特定字符的问题,但我找不到通用的解决方案。在
您需要使用显式的编解码器将
old
值转换为Unicode。该编解码器是什么完全取决于您如何获得old
。在如果它是源代码中的字符串文本,请使用源代码编码。除非在注释的顶部指定了有效的编解码器,否则Python不会接受源文件;请参见PEP 263
将您的
old
定义粘贴到终端将使用终端编解码器(当您粘贴时,终端发送Python编码的字节)。在如果数据来自其他任何地方,则需要确定来自该源的编码。例如,对于HTTP数据,检查
Content-Type
报头中的charset
参数。在然后解码:
当您在没有显式编解码器的情况下使用
unicode(old)
,或者尝试在unicode.replace()
中使用bytestring时,Python使用默认的编解码器ASCII。在在我的终端中演示,配置为使用UTF-8:
^{pr2}$一般来说,您希望尽早解码,延迟编码;使数据流成为Unicode三明治。一旦收到文本,就将其全部解码为Unicode值,在数据离开程序之前不要再次编码。在
相关问题 更多 >
编程相关推荐