Wie erhalten Sie die Anzeigebreite kombinierter Unicode-Zeichen in Python 3?

8

In Python 3 sollen Unicode-Strings dir freundlicherweise die Anzahl der Unicode-Zeichen geben, aber ich kann nicht herausfinden, wie man die endgültige Anzeigebreite eines Strings erhält, wenn einige Zeichen kombiniert werden.

Genesis 1: 1 - בְּבְֵּאשִֵׁאשִׁת, בָּבָָּא אֱאֱִִֹֹם, אֵאֵ ַשַָּׁשַָּׁשִַַָּׁם, ְאְֵאְֵאֵ ָאָָאָָאֶָץ

%Vor%

Aber die Zeichenfolge ist nur 37 Zeichen breit. Normalisierung löst das Problem nicht, weil die Vokale (Punkte unter den größeren Zeichen) unterschiedliche Zeichen sind.

%Vor%

Als Randnotiz: Das textwrap -Modul ist in dieser Hinsicht völlig kaputt und wickelt aggressiv ein, wo es nicht hingehört. str.format scheint ähnlich fehlerhaft zu sein.

Conley Owens 17.06.2015, 03:24
quelle

2 Antworten

3

Eine Reihe von Lösungen, die den Drittanbieter uniseg verwenden, wie von @bobince vorgeschlagen:

%Vor%

Das sieht nach dem richtigen Weg aus.

Hier ist ein Beispiel, das textwrap hochpackt. Lösungen zum Patchen anderer Module sollten ähnlich sein.

%Vor%     
Conley Owens 17.06.2015, 15:33
quelle
3

Das Problem ist das Kombinieren von Zeichen, die Python als unterschiedlich betrachtet, wenn __len__ berechnet wird, aber zu einem einzelnen gedruckten Zeichen zusammengeführt wird.

Um herauszufinden, ob ein Zeichen ein kombinierendes Zeichen ist, können wir das Unicode-Datenmodul :

  

unicodedata.combining(unichr)

     

Gibt die kanonische Kombinationsklasse zurück, die dem Unicode-Zeichen unichr als Ganzzahl zugewiesen ist. Gibt 0 zurück, wenn keine Kombinationsklasse definiert ist.

Eine naive Lösung besteht darin, alle Zeichen mit einer Kombinationsklasse ungleich Null auszublenden. Dadurch bleiben Zeichen übrig, die alleine stehen und uns eine Zeichenkette mit einer Eins-zu-eins-Zuordnung zwischen sichtbaren und darunter liegenden Zeichen geben sollten. (Ich bin ein Unicode-Neuling, und es ist wahrscheinlich komplizierter als das. Es gibt Feinheiten bei der Kombination von Zeichen und Graphem-Extendern, die ich nicht wirklich verstehe, aber für diese spezielle Zeichenfolge nicht wichtig sind.)

Also habe ich diese Funktion entwickelt:

%Vor%

gibt die korrekte Länge für Ihre Zeichenfolge zurück:

%Vor%

Dies ist wahrscheinlich keine vollständige Lösung für alle Unicode-Zeichenfolgen, aber abhängig davon, mit welcher Teilmenge von Unicode Sie arbeiten, kann dies für Ihre Anforderungen ausreichen.

    
alexwlchan 17.06.2015 10:13
quelle

Tags und Links