Это поможет:
int[] utf8Array = {72, 195, 164, 108, 108, 111};
byte[] bytes = new byte[utf8Array.length];
for (int i = 0; i < utf8Array.length; ++i) {
bytes[i] = (byte) utf8Array[i];
}
String theString = new String(bytes, Charset.forName("UTF-8"));
Проблема с передачей int[]
напрямую состоит в том, что класс String
интерпретирует каждый int
как отдельный символ, а после преобразования в byte[]
String
обрабатывает ввод как необработанные байты и понимает, что 195, 164
на самом деле это один символ, состоящий из двух байтов, а не двух символов.
ОБНОВЛЕНИЕ: Отвечая на ваш комментарий, к сожалению, Java является таким подробным. Сравните это со Scala:
val ints = Array(72, 195, 164, 108, 108, 111)
println(new String(ints map (_.toByte), "UTF-8"))
И снова разница между int
и byte
заключается не только в том, что компилятор требователен, они действительно означают разные вещи, когда дело доходит до кодировки UTF-8.