[Java] Aligne les caractères même avec des caractères mixtes demi-largeur et pleine largeur

introduction

Lorsque le format String # était utilisé en Java avec un mélange de caractères demi-largeur et pleine largeur, les positions des caractères étaient mal alignées. Il n'y avait pas de moyen facile de le résoudre même si je cherchais trop, alors j'ai essayé de créer une fonction.

Solution

Immédiatement, mais la solution est la suivante. (Pour le moment, copiez et collez simplement les suivants format () et getByteLength () pour résoudre le problème)

main


    public static void main(String[] args){
        //Instruction de format de décalage
        System.out.println(String.format("%-20s", "Ahhhh")+" | ");
        System.out.println(String.format("%-20s", "aaaaa")+" | ");
        //Instruction de format qui ne change pas
        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                | 

(C'est un secret que «|» était mal aligné lors du copier-coller sur Qiita ...) Ce qui suit est un aparté.

Raisons de l'écart et contre-mesures

En premier lieu, la raison pour laquelle il y a une différence entre la demi-largeur et la pleine largeur est que le nombre d'octets diffère comme suit lors de l'expression de caractères avec ʻUTF-8`.

Donc, je suis en train de régler avec ʻint byte Diff dans main`. En outre, à partir de la fonction suivante, vous pouvez voir que le japonais est de 3 octets et l'anglais est de 1 octet.

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

référence

Recommended Posts

[Java] Aligne les caractères même avec des caractères mixtes demi-largeur et pleine largeur
Conversion pleine largeur → demi-largeur avec Java String (kana pleine largeur → kana demi-largeur)
[Swift] NS Predicate ne peut pas faire la distinction entre pleine largeur et demi-largeur
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
Installez Java et Tomcat avec Ansible
Utilisez JDBC avec Java et Scala.
Sortie PDF et TIFF avec Java 8
Crypter avec Java et décrypter avec C #
Surveillez les applications Java avec jolokia et hawtio
Lier le code Java et C ++ avec SWIG
Essayons WebSocket avec Java et javascript!
[Java] Lecture et écriture de fichiers avec OpenCSV
Défi pour gérer les caractères déformés avec Java AudioSystem.getMixerInfo ()
Créez et testez des applications Java + Gradle avec Wercker
Essayez d'intégrer Ruby et Java avec Dapr
JSON avec Java et Jackson Part 2 XSS mesures
Préparer un environnement de scraping avec Docker et Java
KMS) Chiffrement d'enveloppe avec décryptage openssl et java
Crypter / décrypter avec AES256 en PHP et Java
[Java] Convertir et importer des valeurs de fichier avec OpenCSV
[Review] Lecture et écriture de fichiers avec java (JDK6)