我从生成 unicode 字符串的数据库查询中读取了一个值。由于与此处无关的原因,数据输入人员将字符串值输入数据库:“Assessor's Parcel”(注意“向后”撇号)。我正在编写的代码只是遍历选定的数据库记录并打印出文本。我使用 .format() 操作将变量中的文本插入到打印输出中。众所周知,.format 在传递 unicode 字符串时会失败。因此,为了减少这个难题,我提交以下示例:
>>> a = u"Assessor’s Parcel"
>>> a
u'Assessor\u2019s Parcel'
>>> print a
Assessor’s Parcel
>>> "{0}".format(a)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 8: ordinal not in range(128)
>>>
以上几行来自 PythonWin 的“交互窗口”(PythonWin 2.7.5(默认,2013 年 5 月 15 日,22:43:36)[MSC v.1500 32 位(Intel)] on win32。)
为什么“print a”产生的输出与“a”不同?如果其中任何一个都可以产生合理的输出,为什么 .format() 却不能?
如果我确定我无法输出 unicode 文本(由于某些尚不清楚的原因)并且我对包含“\u”语法的输出感到满意,那么我真的必须包装所有字符串输出吗来自执行转换的某些代码(方法或其他)中的数据库值?
最佳答案
就use unicode ! (请注意,您的错误是该 HOWTO 中的第一个示例)
问题不在于格式,而是在于您尝试将 unicode 对象放入字节串中,因此它尝试对其进行编码(使用默认编码 ascii)。相反,如果您尝试将其格式化为 unicode 文字,则不会有问题..
>>> a = u"Assessor’s Parcel"
>>> '{}'.format(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 8: ordinal not in range(128)
>>> u'{}'.format(a)
u'Assessor\u2019s Parcel'
>>> print u'{}'.format(a)
Assessor’s Parcel
>>>
如果您将字节串放入字节串中,这也不是问题。
>>> '{}'.format(a.encode('utf8'))
'Assessor\xe2\x80\x99s Parcel'
>>> print '{}'.format(a.encode('utf8'))
Assessor’s Parcel
>>>
但这使得以后输出到另一种(不同的)编码变得更加困难。
关于python - print 和 format() 输出的 unicode 字符串不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33180483/