2016-03-04 7 views
1

Где я терпеть неудачу?Как преобразовать строку с символами Unicode в обычную строку?

У меня есть входящая строка от сервера со значением «% u0419% u043E».

Я пытаюсь преобразовать его в нормальную строку, но я вижу китайский букв. И это ошибка, потому что входящая буква является кириллицей.

Код:

// String test = ""%u0419%u043E"; <--- this is Йо (cyrillic) 
byte[] test = { (byte) 0x25, (byte) 0x75, (byte)0x30, (byte)0x34, (byte)0x31, (byte) 0x39,(byte) 0x25, (byte) 0x75, (byte)0x30, (byte)0x34, (byte)0x33, (byte) 0x45}; 
String aaa = new String(test, "UTF-16"); 
aaa = new String(test, "UTF-8"); 
aaa = new String(test, "ISO-8859-5"); 

Изображение объясняет, что я делаю:

enter image description here

ответ

1

Насколько я знаю, это не стандарт кодирования, по крайней мере, один из UTF- * или ISO- *.

Вам необходимо его декодировать самостоятельно, например.

public static String decode(String encoded) { 
    // "%u" followed by 4 hex digits, capture the digits 
    Pattern p = Pattern.compile("%u([0-9a-f]{4})", Pattern.CASE_INSENSITIVE); 

    Matcher m = p.matcher(encoded); 
    StringBuffer decoded = new StringBuffer(encoded.length()); 

    // replace every occurrences (and copy the parts between) 
    while (m.find()) { 
     m.appendReplacement(decoded, Character.toString((char)Integer.parseInt(m.group(1), 16))); 
    } 

    m.appendTail(decoded); 
    return decoded.toString(); 
} 

Это дает:

System.out.println(decode("%u0419%u043E")); 
Йо 
+0

Как заменить, если полный входящий строка containt% 20? Пример: «% u0419% u043E% 20» – DQuade

+0

'% XX' представляется стандартной кодировкой URL, поэтому вы можете использовать' java.net.URLDecoder.decode (someString, «UTF-8») '. Если строка содержит как '% uXXXX', так и'% XX', вы должны выполнить собственное декодирование в первую очередь (он оставит URL-кодированные символы нетронутыми) – bwt

+0

Да, я использую то же самое, что и выше в вашем ответе: после первого декодирования я использую новый pattern **% ([0-f] {2}) ** и новый совпадение. Вопрос закрыт – DQuade