Python字符串格式化与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 个回答
1
试试这个方法:
>>> str1="Adam Matan"
>>> str2=unicode("אדם מתן", "utf8")
>>> print "X %20s X" % str2
X אדם מתן X
>>> print "X %20s X" % str1
X Adam Matan X
3
在Python 2中,没有前缀的字符串字面量是str
类型,这是一种字节字符串。它存储的是任意的字节,而不是字符。UTF-8编码有些字符需要用多个字节来表示。因此,str2
包含的字节数比实际字符要多,这在字符串格式化时会表现出一些意想不到但完全有效的行为。如果你查看这些字符串的实际字节内容(用repr
而不是print
),你会发现这两个字符串的字段实际上都是20个字节(而不是字符!)长。
正如之前提到的,解决办法是使用unicode字符串。在Python中处理字符串时,你必须理解并意识到unicode字符串和字节字符串之间的区别。
7
你需要在第二个字符串前面加上u
,这样就告诉Python这个字符串是Unicode格式的:
>>> str1="Adam Matan"
>>> str2=u"אדם מתן"
>>> print "X %20s X" % str1
X Adam Matan X
>>> print "X %20s X" % str2
X אדם מתן X
这样做可以让Python明白,它是在计算Unicode字符,而不仅仅是字节。