【问题标题】:Python string formatting + UTF-8 strange behaviourPython 字符串格式化 + UTF-8 奇怪的行为
【发布时间】:2011-04-14 16:44:05
【问题描述】:

打印固定长度的格式化字符串(例如%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

有什么想法吗?

【问题讨论】:

    标签: python string utf-8


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      试试这个方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多