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.

  • Cx_Oracle 'ORA-01843: kein gültiger Monat' mit Unicode-Parameter
  • Konvertieren Sie unicode codepoint zu UTF8 hex in python
  • Python- und Unicode-Codepunkt-Extraktion
  • Konvertieren Sie ctime zu Unicode und Unicode zu ctime python
  • Wie ist Unicode intern in Python vertreten?
  • Python Unicode UnicodeEncodeError
  • Kann man das [a-zA-Z] Python-Regex-Muster anpassen und nicht-ASCII-Unicode-Zeichen ersetzen?
  • Kann man irgendwie erklären, wie unicodedata.normalize (form, unistr) mit bearbeitungen arbeiten?
  • Was ist der Standard-Inhaltstyp / Zeichensatz?
  • Python Unicode String als '\ u84b8 \ u6c7d \ u5730' in Datei gespeichert, wie man es wieder in Unicode konvertieren?
  • Wie finde ich chinesischen oder japanischen Charakter in einer String in Python?
  • Python ist die beste Programmiersprache der Welt.