[Java] Richten Sie Zeichen auch mit gemischten Zeichen halber und voller Breite aus

Einführung

Wenn das String # -Format in Java mit einer Mischung aus Zeichen halber und voller Breite verwendet wurde, waren die Zeichenpositionen falsch ausgerichtet. Es gab keine einfache Möglichkeit, es zu lösen, selbst wenn ich zu viel nachgeschlagen hatte, also machte ich eine schnelle Funktion.

Lösung

Sofort, aber die Lösung ist wie folgt. (Kopieren Sie vorerst einfach das folgende Format () und getByteLength () und fügen Sie es ein, um das Problem zu lösen.)

main


    public static void main(String[] args){
        //Shift Format Anweisung
        System.out.println(String.format("%-20s", "Ahhhh")+" | ");
        System.out.println(String.format("%-20s", "aaaaa")+" | ");
        //Formatanweisung, die sich nicht verschiebt
        System.out.println(format("Ahhhh", 20)+" | ");
        System.out.println(format("aaaaa", 20)+" | ");
    }

    private static String format(String target, int length){
        int byteDiff = (getByteLength(target, Charset.forName("UTF-8"))-target.length())/2;
        return String.format("%-"+(length-byteDiff)+"s", target);
    }

    private static int getByteLength(String string, Charset charset) {
        return string.getBytes(charset).length;
    }

result


Ahhhh| 
aaaaa                | 
Ahhhh| 
aaaaa                | 

(Es ist ein Geheimnis, dass | beim Kopieren und Einfügen in Qiita falsch ausgerichtet wurde ...) Das Folgende ist eine Seite.

Gründe für Abweichungen und Gegenmaßnahmen

Erstens besteht der Grund, warum es einen Unterschied zwischen halber und voller Breite gibt, darin, dass sich die Anzahl der "Bytes" wie folgt unterscheidet, wenn Zeichen mit "UTF-8" ausgedrückt werden.

Also passe ich mit int byte Diff in main an. Anhand der folgenden Funktion können Sie außerdem erkennen, dass Japanisch 3 Byte und Englisch 1 Byte beträgt.

analyze


    public static void main(String[] args){
        analyze("Ahhhh");
        analyze("aaaaa");
    }

    private static void analyze(String target){
        System.out.println("\n"+target);
        int length=20;
        System.out.println(format("length()", length)+":"+target.length());
        System.out.println(format("UTF-8 length()", length)+":"+getByteLength(target, Charset.forName("UTF-8")));
        System.out.println(format("diff", length)+":"+(getByteLength(target, Charset.forName("UTF-8"))-target.length())/2);
    }

result


Ahhhh
length()            :5
UTF-8 length()      :15
diff                :5

aaaaa
length()            :5
UTF-8 length()      :5
diff                :0

Referenz

Recommended Posts

[Java] Richten Sie Zeichen auch mit gemischten Zeichen halber und voller Breite aus
Konvertierung in voller Breite → halbe Breite mit Java-Zeichenfolge (Kana in voller Breite → Kana in halber Breite)
[Swift] Über die Unfähigkeit, mit NS Predicate zwischen voller und halber Breite zu unterscheiden
Verwenden Sie Java mit MSYS und Cygwin
Verteilte Ablaufverfolgung mit OpenCensus und Java
Installieren Sie Java und Tomcat mit Ansible
Verwenden Sie JDBC mit Java und Scala.
PDF und TIFF mit Java 8 ausgeben
Mit Java verschlüsseln und mit C # entschlüsseln
Überwachen Sie Java-Anwendungen mit Jolokia und Hawtio
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Probieren wir WebSocket mit Java und Javascript aus!
[Java] Lesen und Schreiben von Dateien mit OpenCSV
Herausforderung, mit verstümmelten Zeichen mit Java AudioSystem.getMixerInfo () umzugehen
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
Versuchen Sie, Ruby und Java in Dapr zu integrieren
JSON mit Java und Jackson Teil 2 XSS-Maßnahmen
Bereiten Sie eine Scraping-Umgebung mit Docker und Java vor
KMS) Umschlagverschlüsselung mit OpenSL- und Java-Entschlüsselung
Verschlüsseln / Entschlüsseln mit AES256 in PHP und Java
[Java] Konvertieren und Importieren von Dateiwerten mit OpenCSV
[Review] Lesen und Schreiben von Dateien mit Java (JDK6)