Java - Как преобразовать символы из unicode(10) С в русские буквы?
Есть файл xml, в котором часть полей представлена в виде: Компенсаци
Как в Java сделать преобразование текста из С (как понимаю это Unicode decimal) в русские буквы?
На чистом коде Java 8, без использования дополнительных библиотек типа apache.
Мой код: по тексту &# заменяем на \u, десятичный код unicode преобразуем в шестнадцатеричный, который преобразуем в символ.
String string = "С"; //строка в HTML(dec)
System.out.println("Html(dec): " + string);
string = string.replaceAll("&#", "\\\\u");
String hex = Integer.toHexString(Integer.parseInt(string.substring(2, 6)));
string = "\\u0" + hex;
System.out.println("Unicode(hex) :" + string);
// string = "\u0421"; //если напрямую задать текст, то распознается как С
String result = "";
try {
byte[] charset = string.getBytes("UTF-8");
result = new String(charset, "UTF-8");
System.out.println("Text:" + result);
} catch (Exception e) {
e.printStackTrace();
}
Проблема: на входе С переводится \u0421 который почему-то не переводится в символ, остается \u0421
Ответы (2 шт):
Сложность заключается в том что \u0421 и ему же подобные - это литералы, т.е. они нормально преобразуются в строку сами по себе, но их нельзя составить из двух и более срок, например так: "\\u0" + hex
System.out.println("\u0421" == "С"); // true
System.out.println("\u" + "0421" == "С"); // error: illegal unicode escape
В этой ситуации мне видится самым простым способом - составить словарь и делать замену по нему, если там только русские буквы и немного символов.
Наверняка может существовать способ проще, возможно он тут еще появится, так что этот в качестве запасного выхода, код приведен как есть без возможных оптимизаций:
public class Main {
public static String convAll(String input){
String ru = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐё";
String result = new String(input);
int offset = 1040; // Начало русского алфавита в юникоде
for (int i=0; i< ru.length(); i++){
result = result.replaceAll("&#" + (offset + i) + ";",
Character.toString(ru.charAt(i)));
}
// заменяем другие частные случаи
result = result.replaceAll("Ё", "Ё");
result = result.replaceAll(" ", " ");
result = result.replaceAll("?", "?");
return result;
}
public static void main(String[] argv) throws Exception {
String test = "Что тут поделаешь?";
System.out.println(convAll(test)); // Что тут поделаешь?
}
}
Чуть поправлю коллегу Daniil Loban. Хотя его код мне нравиться больше
String a ="ю";
int num = Integer.decode(a.substring(2));
String myString = "U+"+Integer.toHexString(num);
System.out.print(Character.toChars(Integer.parseInt(myString.substring(2), 16)));