Seite 1 von 1
Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 06:03
von DerSuchende
Hi, Pythonfreunde!
Ich möchte eine Reihe von Unicode-Zeichen in einer Schleife erzeugen.
Zum Beispiel konnte man mit
for i in range(70,90):
... print(chr(i))
ascii-Zeichen generieren. Habe aber noch keinen Weg gefunden, dies mit
Unicode hinzukriegen. Ich wollte eine Pseudografik generieren und
brauche dazu etliche Blockzeichen wie z.B. so etwas: '╒'
Ich wollte mir ersparen, die alle händisch aufzuschreiben.
Dazu kommt noch das Ärgernis, dass einige meiner Lieblings-Python-Editoren
es nicht zulassen, dass ich mit <str>+<shift>+<u> solche Zeichen schreibe.
(Es gibt aber noch andere, die es doch unterstützen)
Nun meine Frage: Kann man z.B. einen Unicode durch einen Laufindex höher setzen?
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 07:41
von Sirius3
Ja, das geht mit `chr`. Lesbarer ist es aber, die Zeichen als Konstante direkt im Code stehen zu haben und darauf zuzugreifen.
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 09:06
von DerSuchende
Vielen Dank. Ich hatte soviel erfolglos probiert mit Bytecodes und hex(), aber dass es so einfach ist.

Jetzt schreibe ich den vierstelligen Dezimalcode als Parameter in die chr() und es klappt.
Python ist eben doch das beste!!
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 09:22
von Sirius3
Warum überhaupt chr?
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 12:13
von DerSuchende
Ja, warum chr?
1. Wurde es mir doch hier vorgeschlagen.
2. Den Dezimalcode kann ich in meiner Schleife hochzählen und dann
die Unicode-Zeichen haufenweise erzeugen
Übrigens, der Tip mit der Lesbarkeit ist natürlich auch nicht zu verachten. Wenn ich nur wenige
unterschiedliche Zeichen einsetze, ist die zeilenweise Handeingabe wirklich besser.
Aber wenn ich eine Liste von 35 Zeichen hintereinander aufführen will, ist die Schleife doch
naheliegend.
Geht es denn trotzdem noch einfacher oder eleganter?
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 12:44
von Sirius3
Du mußt doch wissen, welcher Rahmenteil zu welchem Codepoint gehört, da ist doch gar nicht viel mit hochzählen zu machen.
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 13:17
von jerch
@DerSuchende Wahlweise kannst Du auch einfach Deinen eigenen Raum mit exotischen Unicode-Zeichen aufspannen und mit sprechenderen Bezeichnern belegen, z.B:
oder als Wörterbuch oder Enum. Das macht den Zugriff beim Verketten im Code handlicher als das Rumfummeln mit magischen Indices.
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 14:28
von DeaD_EyE
Man könnte auch mit den Namen der Unicode-Points arbeiten:
https://www.sql-und-xml.de/unicode-data ... awing.html
Code: Alles auswählen
import unicodedata
class Box:
LEFT_TOP = unicodedata.lookup("BOX DRAWINGS LIGHT DOWN AND RIGHT")
RIGHT_TOP = unicodedata.lookup("BOX DRAWINGS LIGHT DOWN AND LEFT")
LEFT_BOTTOM = unicodedata.lookup("BOX DRAWINGS LIGHT UP AND RIGHT")
RIGHT_BOTTOM = unicodedata.lookup("BOX DRAWINGS LIGHT UP AND LEFT")
V = unicodedata.lookup("BOX DRAWINGS LIGHT VERTICAL")
H = unicodedata.lookup("BOX DRAWINGS LIGHT HORIZONTAL")
def make_box(x, y, text):
x -= 2
y -= 2
y_half = y // 2
print(Box.LEFT_TOP + (Box.H * x) + Box.RIGHT_TOP)
for _ in range(y_half):
print(Box.V + " " * x + Box.V)
print(Box.V + text[:x].center(x) + Box.V)
for _ in range(y_half):
print(Box.V + " " * x + Box.V)
print(Box.LEFT_BOTTOM + (Box.H * x) + Box.RIGHT_BOTTOM)
make_box(30, 10, "Hello World!")
Code: Alles auswählen
┌────────────────────────────┐
│ │
│ │
│ │
│ │
│ Hello World! │
│ │
│ │
│ │
│ │
└────────────────────────────┘
Das mit der Klasse sieht etwas hässlich aus. Kann man anders sicherlich schöner machen.
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 14:59
von Sirius3
Das ganze mit Formatstrings
Code: Alles auswählen
def make_box(width, height, text, title="", box=["╒═╕", "│ │", "╘═╛"]):
FRAME = "{2}{1:{3}^{0}.{0}}{4}"
width -= 2
height -= 2
half_height = height // 2
print(FRAME.format(width, title, *box[0]))
for y in range(height):
output = text if y == half_height else ''
print(FRAME.format(width, output, *box[1]))
print(FRAME.format(width, '', *box[2]))
make_box(30, 10, "Hello World!", "Info")
Ausgabe:
Code: Alles auswählen
╒═══════════ Info ═══════════╕
│ │
│ │
│ │
│ │
│ Hello World! │
│ │
│ │
│ │
╘════════════════════════════╛
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 15:38
von DerSuchende
Uff, da habt ihr mir ja auf die schnelle ein paar interessante Türklinken gezeigt, wo ich noch nicht mal wusste, dass da Türen sind. Die muss ich mal in Ruhe und nacheinander selbst öffnen und dahinter schauen- Mein Ausgangspunkt war ja die Faulheit des Programmierers, der auf die schnelle über weite Codebereiche sich ungeduldig einen Überblick verschaffen wollte, welche Symbole sich so dahinter verstecken, um dass suchen und durchmustern vieler Tabellen einzusparen. Aber jetzt hast Du mich natürlich sofort wieder in Richtung einer echten Python-Denke gestubst, die maximale Eleganz anstrebt. Über das Modul unicodedata war ich noch gar nicht gestolpert. Werde ich aber schnell nachholen, scheint ja 'ne Menge dahinterzustecken. Also nochmal vielen Dank für die Erleuchtung. Auch wenn man schon lange von Python begeistert ist, so macht es jedes mal Spaß, neue Facetten zu entdecken und davon gibt es noch so viele, und sie werden immer mehr.
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 18:08
von __blackjack__
@DerSuchende: Stichpunkt Faulheit des Programmierers: Bibliotheken. Zum Beispiel `rich` mit der Ausgabe vom Beispiel von Sirius3:
Code: Alles auswählen
#!/usr/bin/env python3
import rich
from rich.align import Align
from rich.box import Box
from rich.panel import Panel
BOX = Box(
"""\
╒═╤╕
│ ││
├─┼┤
│ ││
├─┼┤
├─┼┤
│ ││
╘═╧╛
"""
)
def main():
rich.print(
Panel(
Align("Hello World!", "center", vertical="middle"),
BOX,
title="Info",
width=30,
height=10,
)
)
if __name__ == "__main__":
main()
Die Box-Zeichen muss man nur selbst definieren, wenn einem die Konstanten, die es in der Bibliothek schon gibt, nicht ausreichen:
Code: Alles auswählen
$ python3 -m rich.box
╭───────────────╮
│ Box Constants │
╰───────────────╯
box.ASCII box.ASCII2 box.ASCII_DOUBLE_HEAD
+------------------------+ +------------+-----------+ +-----------+----------+
| Header 1 | Header 2 | | Header 1 | Header 2 | | Header 1 | Header 2 |
|------------+-----------| +------------+-----------+ +===========+==========+
| Cell | Cell | | Cell | Cell | | Cell | Cell |
| Cell | Cell | | Cell | Cell | | Cell | Cell |
|------------+-----------| +------------+-----------+ +-----------+----------+
| Footer 1 | Footer 2 | | Footer 1 | Footer 2 | | Footer 1 | Footer 2 |
+------------------------+ +------------+-----------+ +-----------+----------+
box.DOUBLE box.DOUBLE_EDGE box.HEAVY
╔════════════╦═══════════╗ ╔════════════╤═══════════╗ ┏━━━━━━━━━━━┳━━━━━━━━━━┓
║ Header 1 ║ Header 2 ║ ║ Header 1 │ Header 2 ║ ┃ Header 1 ┃ Header 2 ┃
╠════════════╬═══════════╣ ╟────────────┼───────────╢ ┣━━━━━━━━━━━╋━━━━━━━━━━┫
║ Cell ║ Cell ║ ║ Cell │ Cell ║ ┃ Cell ┃ Cell ┃
║ Cell ║ Cell ║ ║ Cell │ Cell ║ ┃ Cell ┃ Cell ┃
╠════════════╬═══════════╣ ╟────────────┼───────────╢ ┣━━━━━━━━━━━╋━━━━━━━━━━┫
║ Footer 1 ║ Footer 2 ║ ║ Footer 1 │ Footer 2 ║ ┃ Footer 1 ┃ Footer 2 ┃
╚════════════╩═══════════╝ ╚════════════╧═══════════╝ ┗━━━━━━━━━━━┻━━━━━━━━━━┛
box.HEAVY_EDGE box.HEAVY_HEAD box.HORIZONTALS
┏━━━━━━━━━━━━┯━━━━━━━━━━━┓ ┏━━━━━━━━━━━━┳━━━━━━━━━━━┓ ──────────────────────
┃ Header 1 │ Header 2 ┃ ┃ Header 1 ┃ Header 2 ┃ Header 1 Header 2
┠────────────┼───────────┨ ┡━━━━━━━━━━━━╇━━━━━━━━━━━┩ ──────────────────────
┃ Cell │ Cell ┃ │ Cell │ Cell │ Cell Cell
┃ Cell │ Cell ┃ │ Cell │ Cell │ Cell Cell
┠────────────┼───────────┨ ├────────────┼───────────┤ ──────────────────────
┃ Footer 1 │ Footer 2 ┃ │ Footer 1 │ Footer 2 │ Footer 1 Footer 2
┗━━━━━━━━━━━━┷━━━━━━━━━━━┛ └────────────┴───────────┘ ──────────────────────
box.MINIMAL box.MINIMAL_DOUBLE_HEAD box.MINIMAL_HEAVY_HEAD
╷ ╷ ╷
Header 1 │ Header 2 Header 1 │ Header 2 Header 1 │ Header 2
╶────────────┼───────────╴ ════════════╪═══════════ ╺━━━━━━━━━━━┿━━━━━━━━━━╸
Cell │ Cell Cell │ Cell Cell │ Cell
Cell │ Cell Cell │ Cell Cell │ Cell
╶────────────┼───────────╴ ────────────┼─────────── ╶───────────┼──────────╴
Footer 1 │ Footer 2 Footer 1 │ Footer 2 Footer 1 │ Footer 2
╵ ╵ ╵
box.ROUNDED box.SIMPLE box.SIMPLE_HEAD
╭────────────┬───────────╮
│ Header 1 │ Header 2 │ Header 1 Header 2 Header 1 Header 2
├────────────┼───────────┤ ──────────────────────── ──────────────────────
│ Cell │ Cell │ Cell Cell Cell Cell
│ Cell │ Cell │ Cell Cell Cell Cell
├────────────┼───────────┤ ────────────────────────
│ Footer 1 │ Footer 2 │ Footer 1 Footer 2 Footer 1 Footer 2
╰────────────┴───────────╯
box.SIMPLE_HEAVY box.SQUARE box.SQUARE_DOUBLE_HEAD
┌────────────┬───────────┐ ┌───────────┬──────────┐
Header 1 Header 2 │ Header 1 │ Header 2 │ │ Header 1 │ Header 2 │
━━━━━━━━━━━━━━━━━━━━━━━━ ├────────────┼───────────┤ ╞═══════════╪══════════╡
Cell Cell │ Cell │ Cell │ │ Cell │ Cell │
Cell Cell │ Cell │ Cell │ │ Cell │ Cell │
━━━━━━━━━━━━━━━━━━━━━━━━ ├────────────┼───────────┤ ├───────────┼──────────┤
Footer 1 Footer 2 │ Footer 1 │ Footer 2 │ │ Footer 1 │ Footer 2 │
└────────────┴───────────┘ └───────────┴──────────┘
Re: Unicode hochzählen?
Verfasst: Mittwoch 26. Mai 2021, 19:58
von DerSuchende
Es ist nicht zu fassen, es wird immer besser

Nun habe ich aber wirklich ausreichend Stoff zum nacharbeiten.