2016-06-29 60 views
0

在我們的堆棧第三方庫被改寫(munging)包含字符串的表情符號等等,像這樣:如何逃生十進制文本轉換回爲Unicode在Java中

「奔\ 240 \ 159 \ 144 \ 144 \ 240 \ 159 \ 142 \ 169「

即十進制字節,而不是十六進制短路。

當然有一個現有的例程可以將它轉換回適當的Unicode字符串,但我發現的所有關於此的討論都需要格式\ u12AF,而不是\ 123。

+0

你確定這是unicode字符嗎? – CSK

+0

字符串是否包含字節或實際轉義序列呈現爲字符?即是'\ 240 \ 159'兩個字節還是8個字節? –

回答

0

我不知道任何現有的套路,但一些簡單的像這樣應該做的工作(假設輸入可以作爲一個字符串):

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); 
    } 
} 

筆者只是用來確保現有的字符在碼點> 127的字符串中編碼正確,如果它們發生未轉義。如果所有非ASCII字符都被轉義,則字節數組輸出流應該足夠了。

+0

這當然比我在寫作時更簡單 - 謝謝! – benkc

+0

雖然它在任何單獨的反斜槓上崩潰。 – benkc

+0

@benkc這個問題並沒有真正指出在這種情況下做什麼O :)可能有意義的檢查(至少)反斜槓後面的字符...... –

相關問題