Necesito codificar/decodificar matrices de bytes UTF-16 hacia y desde java.lang.String
. Los arreglos de bytes me son dados con un Byte Order Marker (BOM), y necesito un byte codificado con una lista de materiales.¿Cómo codifico/decodifico las matrices de bytes UTF-16LE con una lista de materiales?
Además, debido a que estoy tratando con un cliente/servidor de Microsoft, me gustaría emitir la codificación en little endian (junto con la BOM de LE) para evitar cualquier malentendido. Me doy cuenta de que con el BOM debería funcionar Big Endian, pero no quiero nadar aguas arriba en el mundo de Windows.
A modo de ejemplo, este es un método que codifica una java.lang.String
como UTF-16
en Little Endian con una lista de materiales:
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;
}
¿Cuál es la mejor manera de hacer esto en Java? Lo ideal sería evitar copiar toda la matriz de bytes en una nueva matriz de bytes que tenga asignados dos bytes adicionales al principio.
Lo mismo vale para la decodificación de una cadena tal, pero eso es mucho más fácil mediante el uso de la java.lang.String
constructor:
public String(byte[] bytes,
int offset,
int length,
String charsetName)
Gracias! Sin embargo, un problema más ... Usar "UTF-16" codifica los datos como Big Endian, que sospecho que no funcionarán bien con los datos de Microsoft (a pesar de que existe la lista de materiales). ¿Alguna forma de codificar UTF-16LE con BOM con Java? Actualizaré mi pregunta para reflejar lo que realmente estaba buscando ... –
Haz clic en el enlace "ver esta publicación" que dio. Básicamente, rellena un carácter \ uFEFF al principio de la cadena y luego codifica a UTF-16LE, y el resultado tendrá una lista de materiales adecuada. –
Use "UnicodeLittle" (suponiendo que su JRE lo admita - ("\ uEFFF" + "mi cadena"). GetBytes ("UTF-16LE") de lo contrario). Aunque me sorprendería que las API de Microsoft esperaran una lista de materiales pero no pudieran manejar datos de Big-Endian, tienden a gustarles usar BOMs más que otras plataformas. Prueba con cadenas vacías: puede obtener matrices vacías si no hay datos. – McDowell