关于ascii:Python中的chr(128).. chr(255)有什么意义?

What's the point of chr(128) .. chr(255) in Python?

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

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

1
2
>>> chr(65)
'A'

我了解到它在某些情况下是有用的,并且我理解了为什么它覆盖了0..127(7位ASCII范围)。

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

我想知道chr是否接受另一个参数,例如

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

但是,没有这样的选择:

1
2
3
chr(i) -> character

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

我的问题是:为i > 255而不是i > 127提高ValueError的意义是什么? 128 <= i < 256的所有功能都是返回十六进制值吗?


在Python 2.x中,str是字节序列,因此chr()返回一个字节的字符串,并接受0-255范围内的值,因为这是可以用字节表示的范围。当您打印字符串的repr(),其字节在128-255范围内时,该字符以转义格式打印,因为没有标准的方式来表示此类字符(ASCII仅定义了0-127)。您可以使用unicode()将其转换为Unicode,并指定源编码:

1
unicode(chr(200), encoding="latin1")

在Python 3.x中,str是Unicode字符序列,而chr()的范围更大。字节由bytes类型处理。


请注意,python 2字符串处理已损坏。这是我建议切换到python 3的原因之一。

在python 2中,字符串类型旨在表示文本字符串和二进制字符串。因此,chr()用于将整数转换为字节。它与文本,ASCII或ISO-8859-1无关。这是字节的二进制流:

1
2
3
 binary_command = chr(100) + chr(200) + chr(10)
 device.write(binary_command)
 etc()

在python 2.7中,增加了bytes()类型是为了与python 3向前兼容,并且它映射到str()。


我明白您的意思,但这是不正确的。在Python 3.4中,chr被记录为:

Return the string representing a character whose Unicode codepoint is the integer i.

以下是一些示例:

1
2
3
4
>>> chr(15000)
'?'
>>> chr(5000)
'?'

在Python 2.x中,它是:

Return a string of one character whose ASCII code is the integer i.

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

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