在Python 2.X中混合unicode和str...有什么问题?
mystr = 'aaaa'
myvar = u'My string %s' % str(mystr)
将来这会成为问题吗?我正在处理一些内部代码,这些代码使用了Python的电子邮件模块,发现了一些这样的代码。mystr
只会包含ASCII字符,因为它来自一个只包含预定义ASCII字符的列表。
这段代码不是我写的,使用 str(mystr)
或 mystr
并不会改变问题的本质。
使用第一个代码片段,我会得到一个安全的unicode对象,还是说我必须这样做:
mystr = u'aaaa'
myvar = u'My string %s' % mystr
或者
mystr = 'aaaa'
myvar = u'My string %s' % unicode(mystr)
?
(我知道这样做不是正确的方法,我也知道我应该处理异常,我只是想问第一个代码片段是否返回一个有效的unicode对象,或者在执行时Python的内部机制会出问题。)
2 个回答
1
只要你使用的普通8位字符串里面只包含ASCII字符,那就没问题。这种做法可以节省处理时间和内存空间,如果你真的只需要ASCII字符的话。
将来会不会有问题?会的,如果你输入的内容可能是非ASCII字符集的,然后又把它保存到字符串里。总的来说,保持一致性是个好主意——如果你需要广泛使用Unicode,就不要把字符串当作文本的存储方式,除非有很好的理由去这样做。
3
试着在字符串里放一些真实的unicode符号(比如变音符号或者西里尔字母),看看会发生什么有趣的事情。:)
s = 'свят' # world
v = u'здравей %s' % s # hello %s
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128)
问题是,你很可能在编写应用程序的时候,一切都很顺利,但有一天,一个俄罗斯人或德国人写下她的名字,结果却突然出现了一个内部服务器错误
,因为她的名字里有个非ASCII符号。
我知道……我是在问我例子中的情况,只使用ASCII字符。
不,这样是不会有问题的。在我看来,这其实是Python的一个缺陷,因为这是一个潜在的错误,随时可能出现。这个问题本应该是个致命错误,但由于历史原因,我想,它并不是。