Anzeige von Unicode-Strings in Python

Diese Frage hat hier schon eine Antwort:

  • Normalisierung von Unicode 2 Antworten

Wie kann ich die Anzeigebreite eines Unicode-Strings in Python 3.x bestimmen und gibt es eine Möglichkeit, diese Informationen zu verwenden, um diese Strings mit str.format() auszurichten?

Motivationsbeispiel: Drucken einer String-Tabelle auf die Konsole. Einige der Zeichenfolgen enthalten Nicht-ASCII-Zeichen.

 >>> for title in d.keys(): >>> print("{:<20} | {}".format(title, d[title])) zootehni- | zooteh. zootekni- | zootek. zoothèque | zooth. zooveterinar- | zoovet. zoovetinstitut- | zoovetinst.母 | 母母>>> s = 'è' >>> len(s) 2 >>> [ord(c) for c in s] [101, 768] >>> unicodedata.name(s[1]) 'COMBINING GRAVE ACCENT' >>> s2 = '母' >>> len(s2) 1 

Wie man sieht, nimmt str.format() einfach die Anzahl der Codepunkte im String ( len(s) ) als seine Breite ein, was zu schiefen Spalten in der Ausgabe führt. Durch das unicodedata Modul zu unicodedata , habe ich nichts gefunden, was auf eine Lösung hindeutet.

Unicode-Normalisierung kann das Problem für è beheben, aber nicht für asiatische Zeichen, die oft eine größere Anzeigebreite haben. Ähnlich existieren null-breite Unicode-Zeichen (z. B. Null-Breite-Raum für die Erlaubnis von Zeilenumbrüchen innerhalb von Wörtern). Sie können diese Probleme nicht mit Normalisierung umgehen, also bitte nicht vorschlagen, "normalisieren Sie Ihre Zeichenfolgen".

Bearbeiten: Zusätzliche Informationen zur Normalisierung.

Bearbeiten 2: In meinem ursprünglichen Dataset haben auch einige europäische Kombinationszeichen, die auch nach der Normalisierung keinen einzigen Codepunkt ergeben:

  zwemwater | zwemw. zwia̢z- | zw. >>> s3 = 'a\u0322' # The 'a + combining retroflex hook below' from zwiaz >>> len(unicodedata.normalize('NFC', s3)) 2 

One Solution collect form web for “Anzeige von Unicode-Strings in Python”

Sie haben mehrere Möglichkeiten:

  1. Einige Konsolen unterstützen Escape-Sequenzen für die pixelgenaue Positionierung des Cursors. Vielleicht etwas Überdrucken.

    Historische Anmerkung: Dieser Ansatz wurde im Amiga-Terminal verwendet, um Bilder in einem Konsolenfenster anzuzeigen, indem er eine Textzeile druckt und dann den Cursor um ein Pixel nach vorn bewegt. Die übrig gebliebenen Pixel der Textzeile bildeten langsam ein Bild.

  2. Erstellen Sie eine Tabelle in Ihrem Code, die die realen (Pixel-) Breiten aller Unicode-Zeichen in der Schriftart enthält, die im Konsolen- / Terminalfenster verwendet wird. Verwenden Sie ein UI-Framework und ein kleines Python-Skript, um diese Tabelle zu generieren.

    Fügen Sie dann Code hinzu, der die reale Breite des Textes mit dieser Tabelle berechnet. Das Ergebnis ist vielleicht kein Vielfaches der Zeichenbreite in der Konsole. Zusammen mit pixelgenauer Cursorbewegung könnte dies Ihr Problem lösen.

    Hinweis: Sie müssen eine spezielle Behandlung für Ligaturen (fi, fl) und Verbundwerkstoffe hinzufügen. Alternativ können Sie ein UI-Framework laden, ohne ein Fenster zu öffnen und die Grafik-Primitive zu verwenden, um die String-Breiten zu berechnen.

  3. Verwenden Sie das Tab-Zeichen ( \t ), um einzugreifen. Aber das wird nur helfen, wenn Ihr Shell tatsächlich die reale Textbreite verwendet, um den Cursor zu platzieren. Viele Terminals zählen einfach Zeichen.

  4. Erstellen Sie eine HTML-Datei mit einer Tabelle und schauen Sie sie in einem Browser an.

  • Python urllib.request und utf8 decoding Frage
  • Python - Probleme mit regulärem Ausdruck und Unicode
  • Python-Unicode: Wie man gegen Unicode-String tippt
  • UnicodeEncodeError in Python auf der Windows-Konsole
  • UnicodeEncodeError nur beim Ausführen als Cron Job [Duplizieren]
  • Wie konvertiere ich das Format einer Datei von Unicode zu ASCII mit Python?
  • Python - wie man Datei aus Dateisystem mit einem Unicode-Dateinamen sendet?
  • 'Ascii' Codec kann nicht Zeichen an Position * ord nicht im Bereich (128)
  • UnicodeDecodeError: 'ascii' Codec kann das Byte in 0xc3 nicht in Position 304 decodieren: Ordinal nicht im Bereich (128)
  • Python - kann ich Unicode-String-Sprachcode erkennen?
  • MIMEText UTF-8 kodiert Probleme beim Senden von E-Mails
  • Python ist die beste Programmiersprache der Welt.