Мне нужно кодировать/декодировать массивы байтов UTF-16 в и из java.lang.String
. Байт-массивы даны мне с Byte Order Marker (BOM), и мне нужно закодировать байтовые массивы с помощью спецификации.
Кроме того, поскольку я имею дело с клиентом/сервером Microsoft, я бы хотел испустить кодировку в маленьком endian (вместе с LE BOM), чтобы избежать каких-либо недоразумений. Я действительно понимаю, что с помощью спецификации он должен работать с большим энтузиазмом, но я не хочу плавать вверх по потоку в мире Windows.
В качестве примера, здесь приведен метод, который кодирует a 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)