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

3 投票
3 回答
2310 浏览
提问于 2025-04-16 04:21

当你打印一个固定长度的格式化字符串时,比如说用%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字符,而不仅仅是字节。

撰写回答