web-dev-qa-db-fra.com

Vérifiez si une chaîne est UTF-8 valide encodée en Java

Comment puis-je vérifier si une chaîne est au format UTF-8 valide?

36
Michael Bavin

Seules les données d'octets peuvent être vérifiées. Si vous avez construit une chaîne, elle est déjà en UTF-16 en interne.

De plus seuls les tableaux d'octets peuvent être encodés en UTF-8.

Voici un cas courant de conversions UTF-8.

String myString = "\u0048\u0065\u006C\u006C\u006F World";
System.out.println(myString);
byte[] myBytes = null;

try 
{
    myBytes = myString.getBytes("UTF-8");
} 
catch (UnsupportedEncodingException e)
{
    e.printStackTrace();
    System.exit(-1);
}

for (int i=0; i < myBytes.length; i++) {
    System.out.println(myBytes[i]);
}

Si vous ne connaissez pas l'encodage de votre tableau d'octets, juniversalchardet est une bibliothèque pour vous aider à le détecter.

34
DArkO

Le message suivant est tiré des tutoriels officiels Java disponibles sur: https://docs.Oracle.com/javase/tutorial/i18n/text/string.html .

Le programme StringConverter commence par créer une chaîne contenant des caractères Unicode:

String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");

Une fois imprimée, la chaîne nommée original apparaît comme:

AêñüC

Pour convertir l'objet String en UTF-8, appelez la méthode getBytes et spécifiez l'identificateur de codage approprié en tant que paramètre. La méthode getBytes renvoie un tableau d'octets au format UTF-8. Pour créer un objet String à partir d'un tableau d'octets non Unicode, appelez le constructeur String avec le paramètre de codage. Le code qui effectue ces appels est inclus dans un bloc try, au cas où l'encodage spécifié n'est pas pris en charge:

try {
    byte[] utf8Bytes = original.getBytes("UTF8");
    byte[] defaultBytes = original.getBytes();

    String roundTrip = new String(utf8Bytes, "UTF8");
    System.out.println("roundTrip = " + roundTrip);
    System.out.println();
    printBytes(utf8Bytes, "utf8Bytes");
    System.out.println();
    printBytes(defaultBytes, "defaultBytes");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

Le programme StringConverter imprime les valeurs des tableaux utf8Bytes et defaultBytes pour illustrer un point important: la longueur du texte converti peut ne pas être identique à la longueur du texte source. Certains caractères Unicode se traduisent en octets simples, d'autres en paires ou triplets d'octets. La méthode printBytes affiche les tableaux d'octets en appelant la méthode byteToHex, qui est définie dans le fichier source, UnicodeFormatter.Java. Voici la méthode printBytes:

public static void printBytes(byte[] array, String name) {
    for (int k = 0; k < array.length; k++) {
        System.out.println(name + "[" + k + "] = " + "0x" +
            UnicodeFormatter.byteToHex(array[k]));
    }
}

La sortie de la méthode printBytes suit. Notez que seuls le premier et le dernier octet, les caractères A et C, sont identiques dans les deux tableaux:

utf8Bytes[0] = 0x41
utf8Bytes[1] = 0xc3
utf8Bytes[2] = 0xaa
utf8Bytes[3] = 0xc3
utf8Bytes[4] = 0xb1
utf8Bytes[5] = 0xc3
utf8Bytes[6] = 0xbc
utf8Bytes[7] = 0x43
defaultBytes[0] = 0x41
defaultBytes[1] = 0xea
defaultBytes[2] = 0xf1
defaultBytes[3] = 0xfc
defaultBytes[4] = 0x43
1
Bhanu PS Kushwah