Python 中 chr(128) .. chr(255) 的意义是什么?

10

编辑:我在谈论Python 2.7中的行为。

chr函数将0到127之间的整数转换为ASCII字符,例如:

>>> chr(65)
'A'

我了解在某些情况下这很有用,并且我理解为什么它覆盖0..127,即7位ASCII范围。

该函数还接受来自128..255的参数。对于这些数字,它只是返回参数的十六进制表示。在此范围内,不同的字节意味着不同的含义,具体取决于使用哪个ISO-8859标准的哪个部分。

如果chr需要另一个参数,例如:

>>> chr(228, encoding='iso-8859-1') # hypothetical
'ä'

然而,目前没有这样的选项:
chr(i) -> character

Return a string of one character with ordinal i; 0 <= i < 256.

我的问题是:为什么在i > 255而不是i > 127时引发ValueError?对于128 <= i < 256,该函数只返回十六进制值,这有何意义?

你为什么说它返回十六进制值?将 print(str(c))print(repr(c)) 进行对比。 - Dunes
chr(128) => '\x80', chr(129) => '\x81',等等。 - malana
你所看到的是给定字符串的表示,而不是在终端上打印字符时所看到的。 - Dunes
1
你还需要记住,在Python 2.x中,str也被用作字节数组。在这种情况下,需要一种方法来为一个字节可以取的所有可能值创建字符串值。 - Dunes
3个回答

11
在Python 2.x中,str是一个字节序列,因此chr()返回一个字节的字符串并接受0-255范围内的值,因为这是一个字节可以表示的范围。当你打印带有128-255范围内字节的字符串的repr()时,字符以转义格式打印,因为没有标准的方法来表示这样的字符(ASCII仅定义了0-127)。但是你可以使用unicode()将其转换为Unicode,并指定源编码:
unicode(chr(200), encoding="latin1")
在Python 3.x中,str是Unicode字符序列,chr()的范围更大。字节由bytes类型处理。

0

我明白你的意思,但那不正确。在Python 3.4中,chr的文档如下:

返回表示Unicode代码点为整数i的字符的字符串。

以下是一些示例:

>>> chr(15000)
'㪘'
>>> chr(5000)
'ᎈ'

在Python 2.x中,它是这样的:

返回一个ASCII码为整数i的单个字符的字符串。

函数chr在Python中已经存在很长时间了,我认为对各种编码的理解只是在最近的版本中才得到发展。从这个意义上讲,支持基本的ASCII表并在128-255范围内返回扩展ASCII集的十六进制值是有意义的。

即使在Unicode中,ASCII集也仅定义为128个字符,而不是256个,因此没有(曾经没有)一种标准和公认的方法让ord()返回这些输入值的答案。


对于Python 2.7,这是正确的。我已经编辑了问题以明确这一点。 - malana
即使在Unicode中,ASCII集也仅定义为128个字符,而不是256个字符。 ASCII只有128个字符,那么为什么Unicode要用256来定义它呢? - malana
@lmichelbacher:你不是在回答你的原始问题吗?如果ASCII只有128个字符,那么Unicode就会遵循这一点,因此,在128-256范围内没有“ASCII答案”。我包括这一点是为了表明,无论是过去还是现在,128-256范围内的ASCII字符集都没有固定的字符集。希望这可以帮到你。 - Simeon Visser
1
“128-256范围内没有ASCII答案”。确实如此。这就是为什么我想知道为什么chr在这个范围内返回任何内容。256+范围也没有答案,而那个范围会引发错误。 - malana

0
请注意,Python 2的字符串处理存在问题。这也是我建议转向Python 3的原因之一。
在Python 2中,字符串类型被设计为表示文本和二进制字符串。因此,chr()用于将整数转换为字节。它与文本、ASCII或ISO-8859-1没有真正的关系。它是一串字节的二进制流:
 binary_command = chr(100) + chr(200) + chr(10)
 device.write(binary_command)
 etc()

在Python 2.7中,引入了bytes()类型以便与Python 3向前兼容,并且它映射到str()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接