6

谁能解释我这种奇怪的行为?我希望这两种替换方法都可以同时工作或不工作。是只有我还是有人觉得这不连贯?

>>> u'è'.replace("\xe0","")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)
>>> re.sub(u'è','\xe0','',flags=re.UNICODE)
''

(请注意,我并不是要解释为什么 u'è'.replace("\xe0","") 会引发错误!)

4

2 回答 2

2

来自Unicode 文档

这些方法的参数可以是 Unicode 字符串或 8 位字符串。8位字符串在执行操作前会转换为Unicode;将使用 Python 的默认 ASCII 编码,因此大于 127 的字符会导致异常

来自Re Doc

该模块提供类似于 Perl 中的正则表达式匹配操作。要搜索的模式和字符串都可以是 Unicode 字符串以及 8 位字符串。

由于对于 Re 模块,您没有明确指定 Unicode 标志,因此它没有尝试转换,因此不会引发错误。这就是为什么他们的行为不一致

于 2012-05-07T16:40:22.703 回答
1

Python 2.X 对编码的处理有点不自然,它需要隐式转换。当用户不负责转换时,它将尝试使用 unicode 和非 unicode 字符串。最后,这并不能解决问题:开发人员必须从一开始就确认编码。Python 2 只是让事情变得不那么明确和不那么明显。

>>> u'è'.replace(u"\xe0", u"")
u'\xe8'

那是你原来的例子,除了,我特别告诉 Python 所有字符串都是 unicode。如果你不这样做,Python 会尝试转换它们。而且因为 Python 2 中的默认编码是 ASCII,所以这显然会在您的示例中失败。

编码是一个棘手的主题,但有一些好的习惯(比如早期转换,总是确定程序在给定点处理什么类型的数据),它通常(我坚持,通常)进展顺利。

希望有帮助!

于 2017-05-26T00:27:18.087 回答