2014-01-22 44 views
0

我有一個Java對象,我需要馬歇爾。我的對象中的一個屬性具有包含商標符號(™)的字符串說明。商標(™)符號顯示爲?在編組過程中使用JAXB?

但是在編組完成後,它顯示爲問號(?)。我玩過編碼並嘗試將其設置爲US-ASCII,然後返回並完美地顯示符號。

我搜索了ASCII和UTF-8之間的差異,但它看起來像UTF有一個較大的字符集UTF-8 vs ASCII Text

這就是說,如果UTF-8具有較大的字符集,從UTF-8轉到ASCII看起來有點危險。

我也看了這個Usages of ASCII and UTF-8和ASCII使用率低於1%。

使用JAXB對™進行編碼的正確方法是什麼?

我的編組進行解碼,它看起來如下:

public String marshall(final Response response) { 
    final Marshaller marshaller = getContextResponse().createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE); 
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
    final StringWriter writer = new StringWriter(); 
    synchronized (responseMarshalMutex) { 
     marshaller.marshal(response, writer); 
    } 
    return writer.getBuffer().toString(); 
} 
+0

我相信你的陳述是相反的,因爲UTF -8是ASCII的超集,從ASCII到UTF-8總是安全的,因爲你保證不會丟失任何信息,每個字符都會被保留,但是從UTF-8到ASCII是危險的,因爲任何非ASCII字符都會被轉換成''?''(或者會產生一個異常,這取決於你如何進行轉換錫永)。 – VGR

+0

不知道我的措辭是否正確,但正如我所說的「如果UTF-8具有較大的字符集,則從UTF-8轉到ASCII是危險的」。這確實表明UTF-8 =(ASCI +更多)。或者我錯過了一些東西:) – Chrispie

回答

2

當你告訴JAXP使用ASCII作爲編碼,它將使用字符實體...如表示任何非ASCII字符(TM )字符。這將通過一個7位通道而沒有損壞,並且通常可以用不適當的字符編碼「安全地」解碼。

當您告訴JAXP使用UTF-8作爲編碼時,非ASCII字符將被編碼爲多字節序列,其中許多序列已設置最高位。如果您在某個時候嘗試(例如偶然)解碼錯誤的編碼,您可能會受到某種形式的篡改。 (例如,如果XML是在HTTP請求或答覆中發送的,而您忽略在「內容類型」標頭中指定字符編碼,則可能會發生這種情況。

如果選擇此選項,則最好使用ASCII (或拉丁-1)作爲你的編碼,這將最大化你在最終解析XML時獲得相同文本值的機會