Почему Python string.printable содержит непечатаемые символы?

У меня две загадки String.printable в одном вопросе.

Во-первых, в Python 2.6:

>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

Посмотрите на конец строки, и вы увидите, что '\ x0b \ x0c' торчит, как больной палец. Почему они там? Я использую машину с австралийскими настройками, поэтому на ней не должно быть каких-либо символов с диакритическими знаками и т.п.

Затем попробуйте запустить этот код:

for x in string.printable: print x,
print
for x in string.printable: print x

В первой строке успешно печатаются все символы, разделенные пробелом. Два странных символа оказываются мужским и женским символами.

Во второй строке успешно печатаются все символы, ЗА ИСКЛЮЧЕНИЕМ ПОСЛЕДНЕГО, разделенных переводом строки. Печать мужского символа; женский символ заменяется отсутствующим знаком (прямоугольником).

Я уверен, что Python не предназначался для гендерной предвзятости, так что же такого отличия?

Это не заслуживает отдельного ответа, но, скорее всего, большинство людей, которые ищут печатные символы, обнаружат, что string.digits + string.letters + string.punctuation + ' ' даст желаемый результат, который представляет собой «печатные символы без пробелов плюс пробел».

Conspicuous Compiler 04.06.2011 01:41
string.digits + string.ascii_letters + string.punctuation собственно.
Stefan 10.11.2020 23:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
12
2
9 983
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Есть разница между «для печати» и «может отображаться на вашем экране». Ваш терминал отображает коды управления принтером с низким ASCII 0x0B и 0x0C как мужской и женский символы, потому что это то, что содержат эти индексы в вашем шрифте. Эти символы более точно описываются как символы вертикального табулятора и фида формы. Эти два символа, вместе с \ t \ r и \ n, можно распечатать, и они делают четко определенные вещи на принтере.

+1: символы без диакритических знаков. Мы называли их «управляющими каретками» еще тогда, когда у «принтеров» были «каретки».

S.Lott 07.01.2009 00:17

Отлично. Это объясняет, почему они появляются в строке .printable. Теперь, почему терминал будет отображать разные коды в зависимости от расстояния? Интересно, как символ Form Feed взаимодействует с предыдущей новой строкой.

Oddthinking 07.01.2009 01:07

@Oddthinking: ваш драйвер терминала делает все, чтобы сопоставить отправленные символы с осмысленным поведением на вашем терминале. Для правильной работы терминального оборудования иногда требуются символы заполнения и другие ошибки.

S.Lott 07.01.2009 01:49

Изнутри cmd.exe:

>>> print '\x0b'
♂
>>> print '\x0c'
♀
>>> print '\f' # form feed
♀
>>> print '\v' # vertical tab
♂
>>>

Внутри Emacs:

>>> print '\f\v'
^L^K

Вот выдержка из справочной страницы форматы (5):

| Sequence | Character    | Terminal Action                             |
|----------+--------------+---------------------------------------------|
| \f       | form-feed    | Moves the printing position to the initial  |
|          |              | printing position of the next logical page. |
| \v       | vertical-tab | Moves the printing position to the start of |
|          |              | the next vertical tab position. If there    |
|          |              | are no more vertical tab positions left on  |
|          |              | the page, the behavior is undefined.        |

Другие вопросы по теме