Смена кодировки java
Подскажите пожалуйста, считываю построчно xml файл, но местами в нем неверная кодировка. Приходят значения типа "т ;о ;р ;"
Как с помощью java можно корректно отобразить текст?
Ответы (1 шт):
Это скорее всего так в файле "зашифрована" кириллица. Т.е. это, как уже писал Agzam4, html-коды. Они представляют из себя знаки &# цифры и ;. Цифры - это значение из таблицы символов Unicode. Т.е. по сути, из файла нужно найти все эти HTML коды и перевести в символы Unicode.
Если не использовать сторонние библиотеки, то можно написать что-то вроде такого:
public static void main(String[] args) {
String text = "Рубрика \"Мои любимые буквы\". Первая буква это \"т\", " +
"вторая \"о\" ну и последняя, вообще так себе буква но ладно - \"р\".";
System.out.println(replaceHtmlToUtf(text));
}
//заменяем все html коды на utf
public static String replaceHtmlToUtf(String text) {
//задаём ___шаблон___ подстроки, которую будем искать в тексте
//Шаблон &#\\d{4}; будет соответствовать подстроке цифры;
//Примеры: т Ϩ ✆ Ӓ Ҽ и т.д.
Pattern pattern = Pattern.compile("&#\\d{4};");
Matcher matcher = pattern.matcher(text);
//Если в тексте есть совпадения с подстрокой, то find вернёт true
while (matcher.find()) {
//А group вернёт подстроку, совпавшую с шаблоном
String sub = matcher.group();
//Отправляем в метод, который переведёт html код (его содержит sub)
//в символ юникода
char utfChar = htmlToUtf(sub);
//заменяем найденую подстроку(ки) на символ, который вернул метод
text = text.replace(sub, String.valueOf(utfChar));
}
return text;
}
//Достаём из &#число; число, парсим (перводим в int) и затем переводим в уже символ (char)
//этот char возвращаем как результат
public static char htmlToUtf(String htmlChar) {
return (char) Integer.parseInt(htmlChar.substring(2, 6));
}
На выходе получаем:
Рубрика "Мои любимые буквы". Первая буква это "т", вторая "о" ну и последняя, вообще так себе буква но ладно - "р".
Если у вас в файле подстроки именно такого формата "т ;о ;р ;" (с пробелом после цифр), то шаблон нужно поменять на "&#\\d{4}\\s;"
Если вдруг эти подстроки (т ;о ;р ;) не символы юникода, то меняя логику метода htmlToUtf можно переводить их в те символы, которые таким образом зашифрованы