Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串格式+;UTF-8奇怪的行为_Python_String_Utf 8 - Fatal编程技术网

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

Python字符串格式+;UTF-8奇怪的行为,python,string,utf-8,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 Mat

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

试着这样做:

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

您需要通过将
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字符,而不仅仅是字节。

在Python2中,非固定字符串的类型是
str
,这是一个字节字符串。它存储任意字节,而不是字符。UTF-8编码一些超过一个字节的字符<因此,code>str2包含的字节数比实际字符多,并且显示了字符串格式中意外但完全有效的行为。如果查看这些字符串的实际字节内容(使用
repr
而不是
print
),您将看到,在这两个字符串中,字段实际上都有20个字节(不是字符!)长


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

+1提供了很好的解释。您可能想查看本教程以更好地理解本教程