Seite 1 von 1

Extended ASCII codes >=128 wiedergeben?

Verfasst: Freitag 4. August 2006, 08:03
von rumilmirion
Morgen,

folgendes: habe ein Programm, dass Text auf die bash ausgibt. Möchte diesen Text wenn möglich umranden. Dazu brauch ich die jeweiligen "Eckstücke", die haben ASCII codes 191,192,217, u. 218. Laut documentation sollte ja

Code: Alles auswählen

>>> print '\191'
möglich sein, aber das gibt nur nen Smiley mit 91 drangehängt. Irgendwelche Tips, wie dass richtig geht?

Verfasst: Freitag 4. August 2006, 08:17
von jens

Code: Alles auswählen

print chr(191)
:lol:

Verfasst: Freitag 4. August 2006, 09:30
von birkenfeld
Escapes wie "\123" erwarten oktale Zahlenwerte. Deswegen wird dein "\191" als "\1" (Smiley) + "19" gelesen. Dein Randstück wäre also "\277" oder "\xbf".

Ich wäre mir aber nicht so sicher, dass da überall Randstücke rauskommen. Je nach Codepage sind diese Werte nämlich evtl. mit Umlauten oder anderem belegt.

Verfasst: Freitag 4. August 2006, 09:47
von Rebecca
Bei mir gibt's da jeweils ein umgekehrtes Fragezeichen:

Code: Alles auswählen

>>> print "\277"
¿
>>> print "\xbf"
¿
>>> print chr(191)
¿
Vielleicht waere es einfacher, was fertiges herzunehmen wie das curses-Modul oder urwid.

Verfasst: Freitag 4. August 2006, 11:39
von jens
IMHO wäre es besser mit Unicode zu arbeiten...

Auf http://www.decodeunicode.org hab ich mal nach diesen "Text-Rahmen-Zeichen" gesucht:
U+2500 – U+257F Box Drawing

Hab mal was gebastelt und das in's Wiki gepackt: [wiki]Unicode Tabelle[/wiki]

Mit der Tabelle kann man die Zeichen als "Unicode-Zahlen" in sein Skript einbauen!
Beispielausgabe:

>> ─ << | \u2500 | \x2500 | ─ | BOX DRAWINGS LIGHT HORIZONTAL

>> │ << | \u2502 | \x2502 | │ | BOX DRAWINGS LIGHT VERTICAL

>> ┌ << | \u250c | \x250c | ┌ | BOX DRAWINGS LIGHT DOWN AND RIGHT

>> ┐ << | \u2510 | \x2510 | ┐ | BOX DRAWINGS LIGHT DOWN AND LEFT

>> └ << | \u2514 | \x2514 | └ | BOX DRAWINGS LIGHT UP AND RIGHT

>> ┘ << | \u2518 | \x2518 | ┘ | BOX DRAWINGS LIGHT UP AND LEFT

>> ├ << | \u251c | \x251c | ├ | BOX DRAWINGS LIGHT VERTICAL AND RIGHT

>> ┤ << | \u2524 | \x2524 | ┤ | BOX DRAWINGS LIGHT VERTICAL AND LEFT

>> ┬ << | \u252c | \x252c | ┬ | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL

>> ┴ << | \u2534 | \x2534 | ┴ | BOX DRAWINGS LIGHT UP AND HORIZONTAL

>> ┼ << | \u253c | \x253c | ┼ | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL

>> ═ << | \u2550 | \x2550 | ═ | BOX DRAWINGS DOUBLE HORIZONTAL
>> ║ << | \u2551 | \x2551 | ║ | BOX DRAWINGS DOUBLE VERTICAL

>> ╔ << | \u2554 | \x2554 | ╔ | BOX DRAWINGS DOUBLE DOWN AND RIGHT

>> ╗ << | \u2557 | \x2557 | ╗ | BOX DRAWINGS DOUBLE DOWN AND LEFT

>> ╚ << | \u255a | \x255a | ╚ | BOX DRAWINGS DOUBLE UP AND RIGHT

>> ╝ << | \u255d | \x255d | ╝ | BOX DRAWINGS DOUBLE UP AND LEFT

>> ╠ << | \u2560 | \x2560 | ╠ | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT

>> ╣ << | \u2563 | \x2563 | ╣ | BOX DRAWINGS DOUBLE VERTICAL AND LEFT

>> ╦ << | \u2566 | \x2566 | ╦ | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL

>> ╩ << | \u2569 | \x2569 | ╩ | BOX DRAWINGS DOUBLE UP AND HORIZONTAL

>> ╬ << | \u256c | \x256c | ╬ | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
Mit den Angaben in der zweiten Spalte kann man für ein eigenes Programm unicode Zeichen einfügen. z.B. für das Zeichen "╬":

Code: Alles auswählen

print u"\u256c"

Verfasst: Freitag 4. August 2006, 12:23
von birkenfeld
Ja, aber nur wenn das Terminal auch Unicode versteht. Sonst kriegst du halt nur einen

Code: Alles auswählen

UnicodeEncodeError: 'charmap' codec can't encode character u'\u2500' in position 0: character maps to <undefined>

Verfasst: Freitag 4. August 2006, 13:44
von jens
Das ist richtig. Wobei doch eigentlich nur beim Anzeigen zu Problemen kommen kann...
Also wenn man in einer Textdatei das Zeichen "╬" druch ein normales "+"-Zeichen tauschen will, kann man IMHO folgendes machen:

Code: Alles auswählen

line.replace(u"\u256c", "+")
Das wäre auf jeden Fall besser als das Zeichen selber zu verwenden:

Code: Alles auswählen

line.replace("╬", "+")
Wobei das auch klappen müßte, wenn das Encoding des Skriptes richtig ist. Aber die Gefahr das das Sonderzeichnen irgendwann im Skript "kaputt" ist, wäre im ersten Fall nicht gegeben ;)

Ob das Terminal dann unicode kann oder nicht ist in beiden Varianten doch wurscht...

btw. da gibt es ein Bug im Python-Highlighter: http://www.python-forum.de/topic-6782.html

Verfasst: Freitag 4. August 2006, 14:07
von birkenfeld
Es ging aber hier doch explizit um die Ausgabe auf die Textkonsole. Und die ist in vielen Fällen eben nicht auf UTF-8 oder ein anderes Encoding, das alle Unicode-Zeichen umfasst, eingestellt.

Klar kann man in Sourcefiles sein Encoding selbst wählen und mit Unicode-Strings beliebigen Encodings arbeiten.

Verfasst: Freitag 4. August 2006, 17:58
von BlackJack
Na dann testet man halt vor der Ausgabe mal kurz, ob sich die Rahmenzeichen für `sys.stdout.encoding` kodieren lassen und ersetzt sie durch ASCII Zeichen falls nicht.

Wobei ich da wieder ein Fan von einer Kommandozeilenoption für das Programm wäre, wo man "Nicht-ASCII-Rahmen" explizit anfordern muss.