当打印具有固定长度的格式化字符串(例如%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
有什么想法吗?
答案 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