2

您好,请看一下 Python 2.7 上的以下代码片段:

# -*- coding: utf-8 -*-
content = u"<p>和製英語とかカタカナ英語、&lt;br/>ジャパングリッシュなどと呼ばれる英語っぽいけど実は英語じゃない言葉があります。&lt;/p>"
#print content
print content.replace(u"<p>",u"<div>").replace(u"</p>",u"</div>").replace(u"<br/>",u"")
print content.replace("<p>","<div>").replace("</p>","</div>").replace("<br/>","")
print content.replace(r"<p>",r"<div>").replace(r"</p>",r"</div>").replace(r"<br/>",r"")

结果是一样的:

<div>和製英語とかカタカナ英語、ジャパングリッシュなどと呼ばれる英語っぽいけど実は英語じゃない言葉があります。&lt;/div>

我的问题是:三个“替换”语句之间有什么区别吗?(u, r or none?) 哪一个是最好的?

4

2 回答 2

3

第一个是最好的。后两个选项必须将它们的字节字符串隐式转换为 Unicode,以对 Unicode 内容字符串进行替换。否则,使用提供的字符串,结果恰好是相同的。如果替换字符串包含非 ASCII 字符,则后两个会出现 UnicodeDecodeError,因为转换的默认编解码器ascii在 Python 2.X 上。

还要注意速度差异:

C:\>python -m timeit -s "content=u'<p>blah<br/>blah</p>'" "content.replace(u'<p>',u'<div>').replace(u'</p>',u'</div>').replace(u'<br/>',u'')"
1000000 loops, best of 3: 1.09 usec per loop

C:\>python -m timeit -s "content=u'<p>blah<br/>blah</p>'" "content.replace('<p>','<div>').replace('</p>','</div>').replace('<br/>','')"
1000000 loops, best of 3: 1.76 usec per loop

C:\>python -m timeit -s "content=u'<p>blah<br/>blah</p>'" "content.replace(r'<p>',r'<div>').replace(r'</p>',r'</div>').replace(r'<br/>',r'')"
1000000 loops, best of 3: 1.75 usec per loop
于 2012-08-24T22:28:37.180 回答
0

在这种情况下,没有区别,因为这些字符串是纯 ASCII。所以 u" " 与 r" " 和 " <div>" 是一样的——它是五个字节,.<div><div>< d i v >

UTF8 将 ASCII 字符(低于 0x80)编码为......低于 0x80 的相同 ASCII 字符。所以 ASCII 中的 'd' 由字节 0x64 编码,其 UTF8 编码又是 0x64。直到没有国际字符(或者更好的是 00..7F 十六进制范围之外的字符),没有区别。

只要使用一个非ASCII 字符,就会出现差异。例如,在意大利语中,“Pero”是四个字符,编码为四个字节 Pero,而“Però”是四个字符,我认为编码为五个字节(或者是六个字节?),Per-0x80-0xF2 或类似的东西。

有人可能会争论(我也这样做)应该始终使用“u”前缀:如果不需要它没有区别,如果需要它会保存您的数据(UTF8 编码背后的原因是确切地促进这种类型的向后兼容性:请参阅http://en.wikipedia.org/wiki/UTF-8)。

于 2012-08-24T22:11:38.193 回答