Мне нужно кодировать / декодировать байтовые массивы UTF-16 в java.lang.String
. Массивы байтов передаются мне с меткой порядка байтов (BOM) , и мне нужно кодировать байтовые массивы с помощью спецификации.
Кроме того, поскольку я имею дело с клиент-сервером Microsoft, я бы хотел использовать кодирование с прямым порядком байтов (вместе с LE BOM), чтобы избежать недоразумений. Я понимаю, что с BOM она должна работать с прямым порядком байтов, но я не хочу плыть вверх по течению в мире Windows.
В качестве примера, вот метод, который кодирует java.lang.String
как UTF-16
с прямым порядком байтов с спецификацией:
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;
}
Каков наилучший способ сделать это на Java? В идеале я бы хотел избежать копирования всего байтового массива в новый байтовый массив, в начале которого выделены два дополнительных байта.
То же самое касается декодирования такой строки, но это гораздо проще, если использовать java.lang.String
конструктор :
public String(byte[] bytes,
int offset,
int length,
String charsetName)