Comment puis-je vérifier si une chaîne est au format UTF-8 valide?
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.
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