Преобразование символов Java - PullRequest
1 голос
/ 04 ноября 2011

Так что в основном я пытаюсь конвертировать символы из ISO-8859-2 в Windows-1250. К сожалению, ни один из классов кодировщика / декодера Java, похоже, не решил мою проблему.

На данный момент я делаю:

str = str.replace("ń", new String(new char[]{241}));

Фактически преобразует последовательность, но не в правильный символ.

-59, -124 (ń) становится -61, -79 , не должно ли оно стать либо 241 , либо - 24

Ответы [ 3 ]

5 голосов
/ 04 ноября 2011

Желание преобразовать строку Java из одной кодировки в другую в корне неверно - строки - это абстракция символов, независимая от кодировок (ну, в основном).

В Java кодирование - это рецепты преобразования между байтамии строки.Если вы хотите преобразовать из ISO-8859-2 в Windows-1250, вам нужно начать с байтов, преобразовать их в строку, используя ISO-8859-2, и преобразовать их обратно в байты, используя Windows-1250.Это можно сделать с помощью InputStreamReader/Writer или new String(bytes, encoding) и string.getBytes(encoding)

2 голосов
/ 04 ноября 2011

Эхо Инго ответ. Возможно, фрагмент кода продемонстрирует, что происходит:

String defCharset = "ń";
String[] names = { "UTF-16BE", "UTF-8", "ISO-8859-2", "windows-1250" };
for( String name : names ) {
    byte[] bytes = defCharset.getBytes( name );
    for( int i = 0; i < bytes.length; i++ ) {
        System.out.printf( "%s [%d]=%d\n", name, i, (int)( bytes[i] & 0xff ));
    }
}

Что вы должны спросить: кто предоставляет символы ISO-8859-2, а кто хочет использовать символы windows-1250? Тогда как вы будете иметь дело с байтом [], в котором они закодированы?

2 голосов
/ 04 ноября 2011

Кодировка внутри строки всегда одинакова (UTF-16), поэтому ваш код запутан.Он заменяет один символ другим, он не переводит кодировки.

Кроме того, этот код зависит от кодировки вашего исходного файла.Лучше использовать «\ u0144» вместо «ń».

При преобразовании строки в байты реализовано кодирование, как в

str.getBytes("Cp1250")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...