Кодирование массива байтов переменной длины utf8 в Java
на самом деле я в ситуации, когда мне нужно прочитать строку, которая находится в формате utf8, но ее символы используют кодировка переменной длины поэтому у меня проблема с кодированием их в строку, и я получаю странные символы при печати, символы, похоже, на корейском языке, и это код, который я использовал, но не имел результата:
public static String byteToUTF8(byte[] bytes) {
try {
return (new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Charset UTF8_CHARSET = Charset.forName("UTF-8");
return new String(bytes, UTF8_CHARSET);
}
также я использовал UTF-16 и получил немного лучшие результаты, однако это давало мне странные символы, и, согласно документу, приведенному выше, я должен использовать в utf8.
заранее спасибо за помощь.
EDIT:
2 ответов
проблема с отображением имени Bluetooth:
если вы проверите bluetooth-адаптер setName (), вы получите это
https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#setName
допустимые имена Bluetooth не более 248 байт с использованием кодировки UTF-8, хотя многие удаленные устройства могут отображать только первые 40 символов, и некоторые могут быть ограничены только 20.
Android Поддерживается Версии:
если вы проверите ссылку https://stackoverflow.com/a/7989085/2293534, вы получите список Android поддерживаемой версии.
поддерживаемые и не поддерживаемые локали приведены в таблице:
-----------------------------------------------------------------------------------------------------
| DEC Korean | Korean EUC | ISO-2022-KR | KSC5601/cp949 | UCS-2/UTF-16 | UCS-4 | UTF-8 |
-----------------------------------------------------------------------------------------------------
DEC Korean | - | Y | N | Y | Y | Y | Y |
-----------------------------------------------------------------------------------------------------
Korean EUC | Y | - | Y | N | N | N | N |
-----------------------------------------------------------------------------------------------------
ISO-2022-KR | N | Y | - | Y | N | N | N |
-----------------------------------------------------------------------------------------------------
KSC5601/cp949| Y | N | Y | - | Y | Y | Y |
-----------------------------------------------------------------------------------------------------
UCS-2/UTF-16| Y | N | N | Y | - | Y | Y |
-----------------------------------------------------------------------------------------------------
UCS-4 | Y | N | N | Y | Y | - | Y |
-----------------------------------------------------------------------------------------------------
UTF-8 | Y | N | N | Y | Y | Y | - |
-----------------------------------------------------------------------------------------------------
для решения,
Решение#1:
Михаил дал отличный пример для преобразования. Больше вы можете увидеть https://stackoverflow.com/a/40070761/2293534
когда вы вызываете getBytes (), вы получаете необработанные байты строки кодируется в соответствии с собственной кодировкой символов вашей системы (которая может или не может быть UTF-8). Затем вы обрабатываете эти байты, как если бы они были закодировано в UTF-8, чего может и не быть.
более надежным подходом было бы прочитать файл ko_KR-euc в Строка Java. Затем выпишите строку Java с помощью UTF-8 кодирование.
InputStream in = ... Reader reader = new InputStreamReader(in, "ko_KR-euc"); // you can use specific korean locale here StringBuilder sb = new StringBuilder(); int read; while ((read = reader.read()) != -1){ sb.append((char)read); } reader.close(); String string = sb.toString(); OutputStream out = ... Writer writer = new OutputStreamWriter(out, "UTF-8"); writer.write(string); writer.close();
N. B: вы должны, конечно, использовать правильное имя кодировки
решение#2:
использовать StringUtils, вы можете сделать это https://stackoverflow.com/a/30170431/2293534
решения#3:
вы можете использовать Apache Commons IO для преобразования. Очень большой пример приведен здесь: http://www.utdallas.edu/~lmorenoc/research/icse2015/commons-io-2.4/examples/toString_49.html
1 String resource;
2 //getClass().getResourceAsStream(resource) -> the <code>InputStream</code> to read from
3 //"UTF-8" -> the encoding to use, null means platform default
4 IOUtils.toString(getClass().getResourceAsStream(resource),"UTF-8");
Ссылки На Ресурсы:
Я предлагаю вам использовать StringUtils для библиотек Apache. Я считаю, что необходимые способы для описаны здесь: