J'ai besoin de coder/décoder des tableaux d'octets UTF-16 vers et à partir de java.lang.String
. Les tableaux d'octets me sont donnés avec un Byte Order Marker (BOM), et j'ai besoin d'encoder des tableaux d'octets avec une nomenclature.Comment encoder/décoder des tableaux d'octets UTF-16LE avec une nomenclature?
En outre, parce que j'ai affaire à un client/serveur Microsoft, j'aimerais émettre l'encodage en little endian (avec le LE BOM) pour éviter tout malentendu. Je me rends compte qu'avec la nomenclature, cela devrait fonctionner, mais je ne veux pas nager en amont dans le monde de Windows.
À titre d'exemple, est une méthode ici qui code pour une java.lang.String
comme dans UTF-16
little endian avec une nomenclature:
public static byte[] encodeString(String message) {
byte[] tmp = null;
try {
tmp = message.getBytes("UTF-16LE");
} catch(UnsupportedEncodingException e) {
// should not possible
AssertionError ae =
new AssertionError("Could not encode UTF-16LE");
ae.initCause(e);
throw ae;
}
// use brute force method to add BOM
byte[] utf16lemessage = new byte[2 + tmp.length];
utf16lemessage[0] = (byte)0xFF;
utf16lemessage[1] = (byte)0xFE;
System.arraycopy(tmp, 0,
utf16lemessage, 2,
tmp.length);
return utf16lemessage;
}
Quelle est la meilleure façon de le faire en Java? Idéalement, je voudrais éviter de copier tout le tableau d'octets dans un nouveau tableau d'octets qui a deux octets supplémentaires alloués au début.
va de même pour le décodage d'une telle chaîne, mais qui est beaucoup plus simple en utilisant le java.lang.String
constructor:
public String(byte[] bytes,
int offset,
int length,
String charsetName)
Merci! Un autre problème cependant ... Utiliser "UTF-16" encode les données comme Big Endian, que je soupçonne ne pas aller bien avec les données de Microsoft (même si la nomenclature existe). Un moyen d'encoder UTF-16LE avec BOM avec Java? Je vais mettre à jour ma question pour refléter ce que je cherchais vraiment ... –
Cliquez sur le lien "voir ce message" qu'il a posté. Fondamentalement, vous bourrez un caractère \ uFEFF au début de votre chaîne, puis encoder en UTF-16LE, et le résultat aura une nomenclature correcte. –
Utilisez "UnicodeLittle" (en supposant que votre JRE le supporte - ("\ uEFFF" + "ma chaîne"). GetBytes ("UTF-16LE") sinon). Bien que je serais surpris si les API de Microsoft s'attendaient à une nomenclature mais ne pouvaient pas gérer les données big-endian, ils préfèrent utiliser les nomenclatures plus que les autres. Testez avec des chaînes vides - vous pouvez obtenir des tableaux vides s'il n'y a pas de données. – McDowell