2016-07-11 7 views
-1

Ich habe eine Zeichenfolge in json Daten, die wie folgt aussieht:Konvertieren von codierten Unicode-String in Java String

#0023Sat Apr 30 10:46:11 UTC 2016#000a[Interoperability]Interoperability#005c Index=Unknown (R03)#000a[Exif]Shutter#005c Speed#005c Value=1/1999 sec#000a[Exif]Bits#005c Per#005c Sample=8 8 8 bits/component/pixel#000a[Exif]Exposure#005c Bias#005c Value=0 EV#000a[Exif]Sub-Sec#005c Time#005c Original=00#000a 

All diese #xxxx Wörter sind Unicode.

Wie konvertiere ich dies in eine Java String?

+0

Standard-JSON verwendet '\ uXXXX', um Unicode-Werte zu umgehen, nicht' # XXXX'. Jeder JSON-Parser sollte in der Lage sein, '\ uXXXX' automatisch zu behandeln. Wenn Ihr JSON wirklich '# XXXX' enthält, dann 1) ist es kein Standard-JSON und 2) müssen Sie es manuell parsen, um die Zeichen zu dekodieren. –

Antwort

3
Pattern p = Pattern.compile("#([0-9A-Fa-f]{4})"); 
Matcher m = p.matcher(s); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    int c = Integer.parseInt(m.group(1), 16); 
    m.appendReplacement(sb, String.valueOf((char) c)); 
} 
m.appendTail(sb); 
return sb.toString(); 

Dies setzt voraus, dass #XXXX einen UTF-16-Unicode-Codepunkt codiert. Unicode-Codepunkte übertreffen tatsächlich den 16-Bit-Bereich von #XXXX.

+1

Anstelle von 'StringBuffer' können Sie' StringBuilder' für bessere Leistung verwenden. –

+1

In Standard-JSON werden Unicode-Zeichen mit UTF-16-Codeeinheiten im '\ uXXXX'-Format codiert, wobei Nicht-BMP-Codepunkte UTF-16-Ersatzzeichen im' \ uXXXX \ uXXXX'-Format verwenden. Unter der Annahme, dass diese Nicht-Standard-Syntax "# XXXX" ähnlichen Regeln folgt, dekodiert dieser Code BMP- und Nicht-BMP-Codepunkte einfach, da Java-Zeichenfolgen und -Zeichen trotzdem UTF-16 verwenden. –

+0

@FrankPuffer StringBuilder ist in der Tat neuer und schneller, aber [Matcher] (https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html) funktioniert nur mit 'StringBuffer'. –