2016-06-29 12 views
0

Eine Drittanbieter-Bibliothek in unserem Stapel konvertieren ist munging Zeichenkette enthalten Emoji etc etwa so:Wie Escape-dezimal Text wieder in Unicode in Java

„Ben \ 240 \ 159 \ 144 \ 144 \ 240 \ 159 \ 142 \ 169 "

Das heißt, Dezimalbytes, nicht hexadezimale Kurzschlüsse.

Sicherlich gibt es eine vorhandene Routine, um diese wieder in eine richtige Unicode-Zeichenfolge umzuwandeln, aber alle Diskussionen, die ich darüber gefunden habe, erwartet das Format \ u12AF, nicht \ 123.

+0

Sind Sie sicher, dass dies ein Unicode-Zeichen ist? – CSK

+0

Sind in den Strings die Bytes oder die tatsächlichen Escape-Sequenzen als Zeichen enthalten? I.e. ist '\ 240 \ 159' zwei Bytes oder 8 Bytes? –

Antwort

0

Ich bin nicht bekannt, dass bestehende Routine, sondern etwas Einfaches wie dies die Arbeit machen sollte (vorausgesetzt, der Eingang ist als String verfügbar):

public static String unEscapeDecimal(String s) { 
    try { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    Writer writer = new OutputStreamWriter(baos, "utf-8"); 
    int pos = 0; 
    for (int i = 0; i < s.length(); i++) { 
     char c = s.charAt(i); 
     if (c == '\\') { 
     writer.flush(); 
     baos.write(Integer.parseInt(s.substring(i+1, i+4))); 
     i += 3; 
     } else { 
     writer.write(c); 
     } 
    } 
    writer.flush(); 
    return new String(baos.toByteArray(), "utf-8"); 
    } catch (IOException e) { 
    throw new RuntimeException(e); 
    } 
} 

Der Verfasser nur sicher vorhandenen Zeichen machen verwendet wird in der Zeichenkette mit Codepunkten> 127 sind korrekt codiert, sollten sie uncodiert auftreten. Wenn alle Nicht-Ascii-Zeichen maskiert sind, sollte der Byte-Array-Ausgabestrom ausreichen.

+0

Das ist sicherlich einfacher als das, was ich gerade geschrieben habe - danke! – benkc

+0

Allerdings stürzt es auf jedem einzelnen Backslashes ab. – benkc

+0

@benkc Die Frage hat nicht wirklich angegeben, was in diesem Fall zu tun ist O :) Wahrscheinlich macht es Sinn, (mindestens) das Zeichen nach dem Backslash zu überprüfen ... –