我想在Python中寻求对Unicode和str方法的一些澄清。在阅读了一些关于Unicode的explanation之后,仍然有一些疑点,我希望大家可以帮助我:
我正确地说,当声明一个unicode字符串,例如word=u'foo'
时,python使用终端的编码并在例如foo
中解码UTF-8
,并分配{{ 1}} unicode中的十六进制表示?
因此,一般来说,是在文件中打印出字符的过程,在显示映射的字符之前,总是根据编码解码字节流吗?
在我的终端中,为什么word
或'é'.lower()
显示在十六进制str('é')
中,而'a'.lower()则不显示?
答案 0 :(得分:2)
首先我们应该清楚我们只讨论Python 2。 Python 3与众不同。
您需要先解码它,然后对其进行编码并打印。在Python 2中,不要直接打印出unicode!否则,如果系统以不兼容的方式对其进行编码(如“ascii”),则会引发异常。 你必须明确地做所有这些。
简短的回答是“a”不必在“\ x61”中表示,“a”只是更具可读性。更长的答案:通常在交互式shell中,如果键入值并按Enter键,Python将显示字符串的repr()。我认为“repr”会尝试以ascii表示形式打印所有内容。对于“a”,它已经是ascii,所以它直接输出了。对于str“é”,它是UTF-8编码的二进制流,因此Python转义每个字节并打印为'xc3 \ xa9'
答案 1 :(得分:0)
我认为Python不会在控制台I / O上进行任何自动编码或解码。请考虑以下事项:
>>> 'é'
'\xc3\xa9'
>>> 'é'.decode('UTF-8')
u'\xe9'
您会注意到\xe9
是'LATIN SMALL LETTER E WITH ACUTE'的Unicode代码点,而\xc3\xa9
是与UTF-8中相同字符对应的字节序列。
Python 3中的所有内容都发生了变化,因为所有字符串都是Unicode。我不确定那里的规则。
答案 2 :(得分:0)
有关如何指定Python源文件的编码,请参阅http://www.python.org/dev/peps/pep-0263/。对于Python解释器,有PYTHONIOENCODING环境变量。
你使用什么操作系统?
答案 3 :(得分:0)
word = u'foo'
分配一个unicode字符串 object ,而不是“十六进制表示”。 Unicode对象表示文本字符序列。此外,在此上下文中考虑解码是错误的。 Unicode 不是一种编码,它也没有“编码”。repr
,Python将使用sys.stdin.encoding
;对于 unicode 字符串文字的repr
,Python将使用“unicode_escape”。