Кодирование массива байтов переменной длины 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:

значение Base64: S0QtOTI2IEdHMDA2AAAAAA==n enter image description here

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");

Ссылки На Ресурсы:

  1. корейских кодировок и преобразования кодировки
  2. Корейский Локализация
  3. изменение локали по умолчанию
  4. байтовые кодировки и строки

Я предлагаю вам использовать StringUtils для библиотек Apache. Я считаю, что необходимые способы для описаны здесь:

https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/StringUtils.html