14 Stimmen

Warum enthält Pythons string.printable nicht druckbare Zeichen?

Ich habe zwei String.printable Rätsel in einer Frage.

Erstens, in Python 2.6:

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

Am Ende der Zeichenkette finden Sie ' \x0b\x0c ' sticht wie ein wunder Daumen hervor. Warum sind sie da? Ich verwende einen Rechner, der auf australische Einstellungen eingestellt ist, so dass es keine akzentuierten Zeichen oder Ähnliches geben sollte.

Versuchen Sie dann, diesen Code auszuführen:

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

Die erste Zeile druckt erfolgreich alle Zeichen, die durch ein Leerzeichen getrennt sind. Die beiden ungeraden Zeichen stellen sich als die Symbole Männlich und Weiblich heraus.

Die zweite Zeile druckt erfolgreich alle Zeichen außer dem letzten, getrennt durch einen Zeilenvorschub. Das männliche Symbol wird gedruckt; das weibliche Symbol wird durch ein fehlendes Zeichen (ein Kästchen) ersetzt.

Ich bin mir sicher, dass Python nicht geschlechtsspezifisch sein sollte, also was soll der Unterschied?

1 Stimmen

Dies verdient keine gesonderte Antwort, aber die meisten Leute, die nach druckbaren Zeichen suchen, werden feststellen, dass string.digits + string.letters + string.punctuation + ' ' ergibt das gewünschte Ergebnis, nämlich "druckbare Zeichen ohne Leerzeichen plus das Leerzeichen".

0 Stimmen

string.digits + string.ascii_letters + string.punctuation tatsächlich.

28voto

Sparr Punkte 7347

Es gibt einen Unterschied zwischen "druckbar" und "kann auf dem Bildschirm angezeigt werden". Ihr Terminal zeigt die niedrigen ASCII-Druckersteuercodes 0x0B und 0x0C als männliche und weibliche Symbole an, da diese Indizes in Ihrer Schriftart enthalten sind. Diese Zeichen werden genauer als vertikale Tabulator- und Vorschubzeichen bezeichnet. Diese beiden Zeichen, zusammen mit \t \r y \n sind alle druckbar und können auf einem Drucker gut definiert werden.

1 Stimmen

+1: Nicht akzentuierte Zeichen. Früher nannten wir sie "Wagenkontrollzeichen", als "Drucker" noch "Wagen" hatten.

0 Stimmen

Ausgezeichnet. Das erklärt, warum sie in der string.printable erscheinen. Aber warum sollte das Terminal je nach Abstand unterschiedliche Codes anzeigen? Ich frage mich, wie sich das Form Feed-Zeichen mit einem vorangehenden Zeilenumbruch verhält.

1 Stimmen

@Oddthinking: Ihr Terminaltreiber tut einiges, um die gesendeten Zeichen in sinnvolle Verhaltensweisen auf Ihrem Terminal umzusetzen. Die Terminal-Hardware benötigt manchmal Auffüllzeichen und anderen Unfug, um korrekt zu funktionieren.

7voto

jfs Punkte 370717

Über cmd.exe:

>>> print '\x0b'

>>> print '\x0c'

>>> print '\f' # form feed

>>> print '\v' # vertical tab

>>>

Innerhalb von Emacs:

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

Hier ist ein Auszug aus Formate(5) ' man-Seite:

| 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.        |

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X