打印和格式()的unicode字符串输出不一致

时间:2015-10-16 22:29:04

标签: python unicode format

我从生成unicode字符串的数据库查询中读取一个值。由于这里无关紧要的原因,数据输入人员将字符串值输入数据库中:"评估者的包裹" (注意'向后'撇号)。我正在编写代码,这些代码只是通过选定的数据库记录并打印出文本。我使用.format()操作将变量中的文本插入到打印输出中。众所周知,当传递unicode字符串时,.format失败了。因此,为了减少这个难题,我提交以下示例:

>>> 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)
>>>

以上几行来自“交互式窗口”&#39;在Win32上的PythonWin(PythonWin 2.7.5(默认,2013年5月15日,22:43:36)[MSC v.1500 32位(英特尔)]。)

为什么&#39;打印&#39;产生不同的输出而不仅仅是&#39; a&#39;为什么,如果其中任何一个都可以产生合理的输出,那么.format()可以&#t; t?

如果我确定我不能输出unicode文本(因为某些原因尚未知)并且我会满足于包含&#34; \ u&#34;语法,然后我真的必须在转换中的某些代码(方法或其他)中包装数据库值的所有字符串输出吗?

4 个答案:

答案 0 :(得分:2)

只是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
>>>

如果将字节串放入bytestring中,也不会出现问题。

>>> '{}'.format(a.encode('utf8'))
'Assessor\xe2\x80\x99s Parcel'
>>> print '{}'.format(a.encode('utf8'))
Assessor’s Parcel
>>>

但这使得以后输出到另一个(不同的)编码变得更加困难。

答案 1 :(得分:0)

简单地说&#39; a&#39;请求#34;最原始的&#34;值的形式,来自类的 repr 方法。通过str()转换打印值。格式表达式通过一个不同的转换发送它,一个当前使用ASCII的转换。

答案 2 :(得分:0)

以下是我正确打印的一些尝试。 print a.encode('utf-8')似乎是解决方案:

>>> a = u"Assessor’s Parcel"
>>> a
u'Assessor\u2019s Parcel'

>>> print a
Assessor’s Parcel

>>> "{0}".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)

>>> a.encode('utf-8')
'Assessor\xe2\x80\x99s Parcel'

>>> print a..encode('utf-8')
  File "<stdin>", line 1
    print a..encode('utf-8')
            ^
SyntaxError: invalid syntax

>>> print a.encode('utf-8')
Assessor’s Parcel

>>> print a.encode('utf-8')
Assessor’s Parcel

>>> print a..encode('utf-8')
  File "<stdin>", line 1

    print a..encode('utf-8')
            ^
SyntaxError: invalid syntax

>>> a.encode('utf-8')
'Assessor\xe2\x80\x99s Parcel'

>>> print a.encode('utf-8')
Assessor’s Parcel

答案 3 :(得分:0)

在交互式shell中,'a'会打印a的表示形式。您可以使用print repr(a)

实现相同的目标

print a会将str(a)打印到标准输出。 print将始终对输出进行编码,无论输出的编码是什么。因此print asys.stdout.write(a.encode(sys.stdout.encoding) + "\n")

类似

请注意u"string""string"之间的区别。第一个是Unicode字符串 - 一个Unicode代码点序列,而后者是二进制字符串 - 一个字节序列。 Python 3在两者之间做出了更严格的区分(我实际上更喜欢Python 3,因为它更挑剔,因此更好地告诉我我做错了什么)

"{0}".format(a)中,"{0}"是二进制字符串。您尝试使用该二进制字符串中的非ascii字符格式化unicode字符串。失败的原因是你需要告诉Python如何从Unicode转换为二进制字符串。所以你可以这样做:"{0}".format(a.encode('utf-8'))

但是,您可能不需要格式化的二进制字符串,而是格式化的Unicode字符串。在这种情况下,您可以写:u"{0}".format(a)