2009-11-13 23 views
2

我有一個字符串,其中包含引號。我想用HTML實體替換它們,以確保它們不會混淆其他下游系統。對於我的第一次嘗試,我只是說了我想替換字符匹配,直接在我的代碼輸入他們:如何HTML轉義Java字符串中的捲動引號

public static String escapeXml(String s) { 
    StringBuilder sb = new StringBuilder(); 
    char characters[] = s.toCharArray(); 
    for (int i = 0; i < characters.length; i++) { 
     char c = characters[i]; 
     switch (c) { 
      // other escape characters deleted for clarity 
      case '「': 
       sb.append("&#8220;"); 
       break; 
      case '」': 
       sb.append("&#8221;"); 
       break; 
      case '‘': 
       sb.append("&#8216;"); 
       break; 
      case '’': 
       sb.append("&#8217;"); 
       break; 
      default: 
       sb.append(c); 
       break; 
     } 
    } 
    return sb.toString(); 
} 

這編譯和我的Mac上工作得很好,但是當我們的CI服務器(運行在Linux )試圖建立它,它哽咽:

Out.java:[347,16] duplicate case label 

在Linux中構建鏈無法識別這些花哨的人物之間的區別顯然有些部分。

我的下一個嘗試是使用Unicode轉義。不幸的是,這甚至不會編譯在我的Mac:

... 
      case '\u8220': 
       sb.append("&#8220;"); 
       break; 
      case '/u8221': 
       sb.append("&#8221;"); 
       break; 
... 

我的編譯器會引發這樣的抱怨:

Out.java:[346,21] unclosed character literal 

我感到困惑,人們可能會怎麼做替代該位就了事可靠地跨平臺。有人有任何指示嗎?提前致謝。

+0

如何不使用曲線引號? – 2009-11-13 21:08:06

+3

...等等,應該是'case'/ u8221':'或'case'\ u8221':'? – 2009-11-13 21:09:20

+2

回覆:Unicode轉義 - 我看到2個開關案例有不同的斜槓 - \和/ – Thimmayya 2009-11-13 21:14:46

回答

3

編譯器的問題是,因爲你有「/ u8221」而不是「\ u8221」 - 一個斜槓,而不是反斜槓。

我不完全相信,使用實體將有所幫助,但你可以試試......我想這取決於下游的代碼是如何破裂的。

編輯:衛生署,我還沒有發現,你的Unicode值在小數。是的,他們需要在十六進制:)因爲它解釋了爲什麼編譯器抱怨,我會在這裏離開這個答案 - 「\ u8221」是一個完美的字符轉義序列,只是沒有一個你想要的:)

+0

這將是「爲什麼中文字符出現在我的英文文本中?」的另一種情況?-) – 2009-11-13 21:16:55

+0

哈!那麼,這絕對是我的第一個問題。踢那個 - 謝謝,Jon。 – 2009-11-13 21:21:35

4

的Unicode文字是十六進制:

case '\u201c': 
    sb.append("&#8220;"); 
    break; 
.... 

而且,在其他的答案中提到,您在您的文字之一得到了/,而不是\的。

+0

這是我的第二個問題。欣賞它,亞當。 – 2009-11-13 21:22:31

4

可以使用文字字符(即'‘'),但你的構建過程需要在編譯期間指定正確的源編碼。 javac命令選項是-encoding。 (Ant的javac任務上的屬性是相同的。)這應該與保存文件時由IDE使用的任何編碼匹配。

例如,如果您的IDE使用的是UTF-8,但生成機器正在使用其平臺默認編碼的US-ASCII,則特殊字符將被解碼爲?。由於多個案件現在具有相同的標籤,因此您會收到原始錯誤消息。

+0

這是很好的知道。然而,我想我會繼續使用逃脫版本,這樣當我們檢查我們的代碼時,我們不必在各種機器上與編碼問題作鬥爭。謝謝你的信息! – 2009-11-13 21:23:34

0

默認的編碼不同的平臺上鍊接 - Windows使用它自己的ISO-Latin-1的話(至少是我的工作)。 Linux經常使用UTF-8(這很可能是您的問題),Mac使用MacRoman。您可以通過保持純7位ASCII碼來避開大部分問題,並且如果您在源代碼中需要它,則可以使用\ u以上的任何內容。

就我個人而言,我會保留Java源代碼之外的任何「國家」,並使用本地化功能查找簡單密鑰的翻譯字符串,並將它們放置在您的Java代碼中。

相關問題