В чем смысл 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 ().