如何解码包含UTF-8的字符串(十六进制)

时间:2017-01-17 06:26:48

标签: java utf-8 hex

我正在尝试解码一个字符串,其中可能包含多个UTF8 (十六进制)编码,如下所示:

"IMPU=H\u’C3A9’tm\u’C3A9’rf\u’C3B6’ldescsizma,AC=IMPU,AC=C-NTDB". 

我想将下面的字符串解码为有意义的字符串。

我试过了:

String hex = "H\\u’C3A9’tm\\u’C3A9’rf\\u’C3B6’ldescsizma,DC=IMPU,DC=C-NTD‌​B"; 
ByteBuffer buff = ByteBuffer.allocate(hex.length()/2); 
for (int i = 0; i < hex.length(); i+=2) {
    buff.put((byte)Integer.parseInt(hex.substring(i, i+2), 16)); 
} 
buff.rewind(); 
Charset cs = Charset.forName("UTF-8"); 
CharBuffer cb = cs.decode(buff);
System.out.println(cb.toString());

不知道如何进一步处理,如果有人有任何想法,请告诉我。

1 个答案:

答案 0 :(得分:1)

这是一种方法:

String input = "IMPU=H\\u’C3A9’tm\\u’C3A9’rf\\u’C3B6’ldescsizma,AC=IMPU,AC=C-NTDB";

StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("\\\\u’([0-9A-F]{4}(?:[0-9A-F]{2}){0,2})’").matcher(input);
while (m.find()) {
    byte[] utf8bytes = javax.xml.bind.DatatypeConverter.parseHexBinary(m.group(1));
    m.appendReplacement(buf, new String(utf8bytes, StandardCharsets.UTF_8));
}
String output = m.appendTail(buf).toString();

System.out.println(input);
System.out.println(output);

*使用DatatypeConverter取自this SO answer

输出

IMPU=H\u’C3A9’tm\u’C3A9’rf\u’C3B6’ldescsizma,AC=IMPU,AC=C-NTDB
IMPU=Hétmérföldescsizma,AC=IMPU,AC=C-NTDB