Wie kann ich die bevorzugte Anzeigebreite (in Spalten) von Unicode-Zeichen ermitteln?

In verschiedenen Unicode-Codierungen, zum Beispiel UTF-16le oder UTF-8, ein Zeichen kann 2 oder 3 Bytes belegen. Bei vielen Unicode-Anwendungen wird die Anzeigebreite von Unicode-Zeichen nicht berücksichtigt, so wie es bei allen lateinischen Buchstaben der Fall ist. Zum Beispiel in 80 -Spaltentext, der @ enthalten soll 40 Chinesische Schriftzeichen oder 80 Lateinische Buchstaben in einer Zeile, aber die meisten Anwendungen (wie Eclipse, Notepad ++ und alle bekannten Texteditoren, ich wage es, wenn es eine gute Ausnahme gibt) zählen nur jedes chinesische Zeichen als 1 Breite als lateinischer Buchstabe. Dies macht das Ergebnisformat auf jeden Fall hässlich und unausgerichtet.

Beispielsweise führt eine Tabulatorbreite von 8 zu folgendem unschönen Ergebnis (alle Unicode-Zeichen werden als 1 Anzeigebreite gezählt):

apple   10
banana  7
苹果      6
猕猴桃     31
pear    16

Das erwartete Format ist jedoch (Zähle jedes chinesische Zeichen als 2-fache Breite):

apple   10
banana  7
苹果    6
猕猴桃  31
pear    16

Die falsche Berechnung der Anzeigebreite von Zeichen macht diese Editoren bei der Tabulatorausrichtung, beim Zeilenumbruch und bei der Neuformatierung von Absätzen völlig unbrauchbar.

Die Breite eines Zeichens kann zwischen verschiedenen Schriftarten variieren. In allen Fällen von Terminal-Schriftarten mit fester Größe ist das chinesische Zeichen jedoch immer doppelt so breit. Das heißt, dass trotz der Schriftart jedes chinesische Zeichen vorzugsweise in zwei Breiten angezeigt wird.

Eine Lösung ist, ich kann die richtige Breite durch Konvertieren der Codierung in @ erhalt GB2312, im GB2312ie @ -Codierung jedes chinesischen Zeichens dauert 2 Byte. Einige Unicode-Zeichen sind im GB2312-Zeichensatz jedoch nicht vorhanden (oder GBK Zeichensatz). Und im Allgemeinen ist es keine gute Idee, die Anzeigebreite aus der codierten Größe in Bytes zu berechnen.

Um einfach alle Zeichen in Unicode im Bereich von (@ zu berechn\u0080 ..\uFFFF) as 2 width ist auch nicht korrekt, da auch viele 1 width Zeichen im Bereich verstreut sind.

Es ist auch schwierig, die Anzeigebreite von arabischen und koreanischen Buchstaben zu berechnen, da sie ein Wort / ein Zeichen aus einer beliebigen Anzahl von Unicode-Codepunkten bilden.

So, die Anzeigebreite eines Unicode-Codepunkts ist möglicherweise keine ganze Zahl, ich halte das für in Ordnung, sie können in der Praxis auf eine ganze Zahl geerdet werden, zumindest besser als keine.

Also, gibt es ein Attribut, das mit der bevorzugten Anzeigebreite eines Zeichens im Unicode-Standard zusammenhängt? Oder eine Java-Bibliotheksfunktion zur Berechnung der Anzeigebreite?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage