В чем смысл chr(128). chr (255) в Python?

Edit: я говорю о поведении в 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.

мои вопросы: Какой смысл поднимать ValueError на i > 255 вместо i > 127? Вся функция делает для 128 <= i < 256 это возвращаемые шестнадцатеричные значения?

3 ответов


В Python 2.x, a str - это последовательность байтов, так что chr() возвращает строку в один байт и принимает значения в диапазоне 0-255, так как это диапазон, который может быть представлен байтом. При печати repr() строки с байтом в диапазоне 128-255, символ печатается в формате escape, потому что нет стандартного способа представления таких символов (ASCII определяет только 0-127). Вы можете преобразовать его в Unicode, используя unicode() однако и укажите источник кодировка:

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

В Python 3.x,str представляет собой последовательность символов Юникода и chr() занимает гораздо больший диапазон. Байты обрабатываются bytes тип.


Я понимаю, что вы говорите, но это неправильно. В Python 3.4 chr описан как:

возвращает строку, представляющую символ, кодовая точка Юникода которого является целым числом i.

и вот несколько примеров:

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

В Python 2.х это:

возвращает строку из одного символа, код ASCII которого является целым числом i.

функции chr вокруг в течение длительного времени внутри Python и я думаю, что понимание различных кодировок разработано только в последних выпусках. В этом смысле имеет смысл поддерживать базовую таблицу ASCII и возвращать шестнадцатеричные значения для расширенного набора ASCII в диапазоне 128 - 255.

даже в Unicode набор ASCII определяется только как 128 символов, а не 256, поэтому нет (не было) стандартного и принятого способа позволить ord() верните ответ для этих входных значений.


обратите внимание, что обработка строк 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 ().