根據說明書中所述,這裏有一些Java代碼的測試和工程:
public static String escape(String s){
if (s == null) return s;
int len = s.length();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++){
char c = s.charAt(i);
if (c >= 0x20 && c < 0x80){
if (c == '\\' || c == '{' || c == '}'){
sb.append('\\');
}
sb.append(c);
}
else if (c < 0x20 || (c >= 0x80 && c <= 0xFF)){
sb.append("\'");
sb.append(Integer.toHexString(c));
}else{
sb.append("\\u");
sb.append((short)c);
sb.append("??");//two bytes ignored
}
}
return sb.toString();
}
重要的是,你需要追加2個字符(靠近unicode字符或者只是使用?代替)在轉義的uncode之後。因爲unicode佔用2個字節。
此外,規範說如果代碼點大於32767,你應該使用負值,但在我的測試中,如果你不使用負值,那就沒問題。
這裏是規格:
\ UN此關鍵字表示具有根據當前ANSI代碼頁上沒有等效ANSI表示一個單一的Unicode字符。 N表示以十進制數表示的Unicode字符值。 此關鍵字後面跟着ANSI代碼中的等效字符。這樣,老的讀者會忽略\ uN關鍵詞並正確地選取ANSI表示。遇到這個關鍵字時,讀者應忽略接下來的N個字符,其中N對應於遇到的最後一個\ ucN值。
與所有RTF關鍵字一樣,關鍵字終止空間可能存在(ANSI字符之前),這些空間不包括在要跳過的字符中。雖然這不太可能發生(或推薦),但\ bin關鍵字,其參數以及後面的二進制數據被認爲是用於跳過目的的一個字符。如果在掃描可跳過的數據時遇到RTF作用域分隔符(即打開或關閉大括號),則可跳過的數據被視爲在分隔符之前結束。這使讀者可以執行一些基本的錯誤恢復。要在可跳過的數據中包含RTF分隔符,必須使用適當的控制符號(即,用反斜槓轉義)以純文本形式表示它。任何RTF控制字或符號被視爲用於計算可跳過字符的單個字符。
一個RTF編寫器,當它遇到一個沒有相應的ANSI字符的Unicode字符時,應該輸出\ uN,後面跟着它可以管理的最好的ANSI表示。另外,如果Unicode字符轉換爲字符數與當前Unicode字符字節數不同的ANSI字符流,則應在\ uN關鍵字之前發出\ ucN關鍵字以通知讀者該更改。
RTF控制字通常接受帶符號的16位數作爲參數。由於這個原因,Unicode值大於32767必須表示爲負數
嗯,非常有趣的一點。如果那是真的,那麼在我的邏輯中有可能出現錯誤...而伊恩坎普的回答更有意義......我會繼續使用Google搜索 – Emir 2009-09-02 15:21:57
謝謝你的例子,它的工作原理! – Emir 2009-09-03 10:51:56