在Python 2.6中使用unicode_literals的任何问题?

问题:

我们已经在Python 2.6中运行了代码库。为了准备Python 3.0,我们开始添加:

from __future__ import unicode_literals

进入我们的.py文件(我们修改它们)。我想知道其他人是否已经这样做,并遇到任何不明显的问题(可能在花费大量的时间调试之后)。

回答:

我使用unicode字符串的主要问题是当您将utf-8编码的字符串与unicode字符串混合使用时。
例如,考虑以下脚本。
two.py

# encoding: utf-8
name = 'helló wörld from two'

one.py

# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name

运行python one.py的输出是:

Traceback (most recent call last):
  File "one.py", line 5, in <module>
    print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)

在这个例子中,two.name是一个utf-8编码的字符串(不是unicode),因为它没有导入unicode_literalsone.name是一个unicode字符串。当混合两者时,python会尝试对编码的字符串进行解码(假设它是ascii)并将其转换为unicode并失败。如果你print name + two.name.decode('utf-8')
如果您编码字符串并尝试稍后混合,同样的事情可能会发生。
例如,这样做:

# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
    html = html.encode('utf-8')
print 'DEBUG: %s' % html

输出:

DEBUG: <html><body>helló wörld</body></html>

但添加import unicode_literals之后,它不会:

# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
    html = html.encode('utf-8')
print 'DEBUG: %s' % html

输出:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)

它失败,因为'DEBUG: %s'是一个unicode字符串,因此python尝试解码html。解决打印的几种方法是做print str('DEBUG: %s') % htmlprint 'DEBUG: %s' % html.decode('utf-8')
我希望这可以帮助您了解使用unicode字符串时的潜在问题。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Any gotchas using unicode_literals in Python 2.6?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 8 = 2