python - print 和 format() 输出的 unicode 字符串不一致

标签 python unicode format

我从生成 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/

相关文章:

python - 相当于 Python 的 Swift URL 字符串模板

python - 使用 Tweepy/Twython 在 Python 中获取关注者列表时出现错误的身份验证数据错误

format - 如何在 Lisp 中使用 FORMAT 输出波形符?

Python - 字典 - 最大值和根据键与函数和 for 循环

c++ - 如何对包含 Unicode 字符的 std::wstring 进行 HTML/URL 编码?

c - 是否有将 Unicode 代码点转换为 UTF-8 的 C 库?

c++ - 如何在 C++ 中使用 unicode\u003c?

c - 如何格式化表格,如 C 所示

Python - Paramiko - 不兼容的 ssh 服务器

python - 使用 Monte Carlo 与 scipy.integrate.nquad 的不同积分结果