Extended ASCII codes >=128 wiedergeben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rumilmirion
User
Beiträge: 34
Registriert: Mittwoch 3. Mai 2006, 12:09

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Code: Alles auswählen

print chr(191)
:lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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>
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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