在字符串中使用非ascii字符时的奇怪文字

时间:2013-10-18 13:03:10

标签: python unicode

我有以下测试:

# -*- 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)的更多信息?
  • 如何以十六进制转储字节?

1 个答案:

答案 0 :(得分:1)

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