Преобразование UTF-8 к ISO-8859-1 в Java - как сохранить его как единственный байт

Вы можете использовать slide.slideorder_set, как описано в документе django docs

59
задан Joachim Sauer 17 March 2009 в 20:42
поделиться

4 ответа

Если Вы имеете дело с кодировками символов кроме UTF-16, Вы не должны использовать java.lang.String или char примитивный - необходимо только использовать byte[] массивы или ByteBuffer объекты. Затем можно использовать java.nio.charset.Charset для преобразования между кодировкой:

Charset utf8charset = Charset.forName("UTF-8");
Charset iso88591charset = Charset.forName("ISO-8859-1");

ByteBuffer inputBuffer = ByteBuffer.wrap(new byte[]{(byte)0xC3, (byte)0xA2});

// decode UTF-8
CharBuffer data = utf8charset.decode(inputBuffer);

// encode ISO-8559-1
ByteBuffer outputBuffer = iso88591charset.encode(data);
byte[] outputData = outputBuffer.array();
99
ответ дан Adam Rosenfield 7 November 2019 в 14:41
поделиться
byte[] iso88591Data = theString.getBytes("ISO-8859-1");

добьется цели. Из Вашего описания кажется, как будто Вы пытаетесь "сохранить Строку ISO-8859-1". Строковые объекты в Java всегда неявно закодированы в UTF-16. Нет никакого способа изменить то кодирование.

, Что можно сделать, 'хотя должен получить байты, которые составляют некоторое другое кодирование его (использование .getBytes() метод как показано выше).

31
ответ дан JL2210 7 November 2019 в 14:41
поделиться

Запуск с ряда байтов, которые кодируют строку с помощью UTF-8, создает строку из тех данных, затем получите некоторые байты, кодирующие строку в другом кодировании:

    byte[] utf8bytes = { (byte)0xc3, (byte)0xa2, 0x61, 0x62, 0x63, 0x64 };
    Charset utf8charset = Charset.forName("UTF-8");
    Charset iso88591charset = Charset.forName("ISO-8859-1");

    String string = new String ( utf8bytes, utf8charset );

    System.out.println(string);

    // "When I do a getbytes(encoding) and "
    byte[] iso88591bytes = string.getBytes(iso88591charset);

    for ( byte b : iso88591bytes )
        System.out.printf("%02x ", b);

    System.out.println();

    // "then create a new string with the bytes in ISO-8859-1 encoding"
    String string2 = new String ( iso88591bytes, iso88591charset );

    // "I get a two different chars"
    System.out.println(string2);

это производит строки и iso88591 байты правильно:

âabcd 
e2 61 62 63 64 
âabcd

, Таким образом, Ваш массив байтов не был соединен с корректным кодированием:

    String failString = new String ( utf8bytes, iso88591charset );

    System.out.println(failString);

Выводы

âabcd

(или что, или Вы просто записали utf8 байты в файл и считали их в другом месте как iso88591)

7
ответ дан Pete Kirkham 7 November 2019 в 14:41
поделиться

исключить символы, отличные от ISO-8859-1, будет заменить на '?' (перед отправкой в ​​базу данных ISO-8859-1, например):

utf8String = new String (utf8String.getBytes (), «ISO-8859-1»);

-4
ответ дан 24 November 2019 в 18:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: