Python字符串格式化+ UTF-8奇怪的行为

时间:2010-09-20 13:35:47

标签: python string utf-8

当打印具有固定长度的格式化字符串(例如%20s)时,宽度不同于UTF-8字符串与普通字符串:

>>> str1="Adam Matan"
>>> str2="אדם מתן"
>>> print "X %20s X" % str1
X           Adam Matan X
>>> print "X %20s X" % str2
X        אדם מתן X

注意区别:

X           Adam Matan X
X        אדם מתן X

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

您需要通过将u放在字符串前面来指定第二个字符串是Unicode:

>>> str1="Adam Matan"
>>> str2=u"אדם מתן"
>>> print "X %20s X" % str1
X           Adam Matan X
>>> print "X %20s X" % str2
X              אדם מתן X

这样做可以让Python知道它正在计算Unicode字符,而不仅仅是字节。

答案 1 :(得分:3)

在Python 2中,未加前缀的字符串文字属于str类型,它是字节字符串。它存储任意字节,而不是字符。 UTF-8使用多个字节对某些字符进行编码。因此,str2包含的字节数多于实际字符数,并显示字符串格式中的意外但完全有效的行为。如果您查看这些字符串的实际字节内容(使用repr而不是print),您会看到,在两个字符串中,字段实际上是20个字节(不是人物!)很长。

如前所述,解决方案是使用unicode字符串。在Python中使用字符串时,您绝对需要理解并实现unicode和字符串之间的区别。

答案 2 :(得分:1)

尝试这种方式:

>>> str1="Adam Matan"
>>> str2=unicode("אדם מתן", "utf8")
>>> print "X %20s X" % str2
X              אדם מתן X
>>> print "X %20s X" % str1
X           Adam Matan X