-1

我有以下测试:

# -*- coding: utf-8 -*-

def test_literals():
    test_cases = [
        'aaaaa',
        'ááááá',
        u'aaaaa',
        u'ááááá',
    ]
    FORMAT = '%-20s -> %2d %s'
    for data in test_cases :
        print FORMAT % (data, len(data), type(data))

test_literals()

这使:

aaaaa                ->  5 <type 'str'>
ááááá           -> 10 <type 'str'>
aaaaa                ->  5 <type 'unicode'>
ááááá                ->  5 <type 'unicode'>

我很惊讶'ááááá'。那是什么样的字面意思?它不是 unicode,因为它没有u前缀(并且类型说str),但它也不是普通的 ascii 字符串。我想知道:

  • 它是什么?
  • 是否可以从对象的类型中获取有关basestring对象 ( unicode / str) 的更多信息?
  • 如何以十六进制转储字节?
4

1 回答 1

1
  1. 这是一个 UTF-8 编码的字符串。它正确打印的事实表明您的终端也恰好使用 UTF-8。幸运的你。该脚本在 Windows 机器上会失败。
    我怎么知道这个?您将脚本声明为 UTF-8 编码,因此 Python 将相应地解释源代码。打印时,Python 会将编码字符串的原始字节发送到控制台。如果将其设置为相同的编码,则会得到正确的输出。如果没有,你不会。
  2. 不,您需要知道正在使用的编码。理想情况下,您可以自己控制。在现实世界中,有时可能会做出有灵感的猜测(请参阅chardet),但您不能依赖于此。
  3. 请参阅@falsetru 的评论。

总而言之,如果这让您感到困惑,它可能会促使您切换到 Python 3,这一切都变得容易得多。

于 2013-10-18T13:08:41.770 回答