我們在DB中有一個clob列。現在,當我們提取這個clob並嘗試顯示它(純文本而不是html)時,它會在html屏幕上打印一些垃圾文字。當直接傳輸到一個文件中的字符看起來像」
(不是一般的雙普通鍵盤上的引號)字符編碼問題?
一個多觀察:
System.out.println("」".getBytes()[0]);
打印-108
。
爲什麼一個字符字節應該在負的範圍內?有什麼方法可以在html屏幕上正確顯示它嗎?
我們在DB中有一個clob列。現在,當我們提取這個clob並嘗試顯示它(純文本而不是html)時,它會在html屏幕上打印一些垃圾文字。當直接傳輸到一個文件中的字符看起來像」
(不是一般的雙普通鍵盤上的引號)字符編碼問題?
一個多觀察:
System.out.println("」".getBytes()[0]);
打印-108
。
爲什麼一個字符字節應該在負的範圍內?有什麼方法可以在html屏幕上正確顯示它嗎?
回覆:您的最後一點 - Java的字節總是簽署。爲了將其解釋爲無符號,你可以用一個int位與他們:
byte[] bytes = "」".getBytes("UTF-8");
for(byte b: bytes)
{
System.out.println(b & 0xFF);
}
,輸出:
226
128
157
請注意,您的字符串實際上是三個字節長的UTF-8。
正如在評論中指出,這取決於編碼。對於UTF-16你:
254
255
32
29
和US-ASCII或ISO-8859-1你
63
這是一個問號(即「我不知道,一些新發明字符」)。 Note that:
此方法[
getBytes()
]的當此字符串不能 在給定的charset編碼的行爲是未指定的。當需要對編碼過程進行更多控制時,應使用CharsetEncoder類 。
我認爲,這將是更好的打印像這樣的字符代碼:
System.out.println((int)'」');//result is 8221
This link可以幫你解釋這個非同尋常的雙引號(包括HTML代碼)。
要獲得關於HTML文檔中正確顯示字符的問題,你需要做兩件事情之一:要麼設置文檔的編碼或實體IZE非ASCII字符。
要設置編碼,您有兩個選項。
Content-Type: text/html; charset=UTF-8
。<meta charset="UTF-8" />
標籤添加到您的 頁面的頭部。請記住,選項1將優先選項2.即如果您已經在標題中設置了不正確的字符集,則無法用元標記覆蓋它。
另一種選擇是實體化非ASCII字符。對於您問題中的引號字符,您可以使用”
或”
或”
。第一個是用戶友好的命名實體,第二個用十進制指定字符的Unicode代碼點,第三個用十六進制指定代碼點。所有的都是有效的,所有的都可以。
通常,如果您要從包含未知字符的數據庫中實體化動態內容,最好使用實體的代碼點版本,因爲您可以輕鬆編寫一種方法將任何字符> 127到適當的代碼點。
我目前正在處理的一個系統實際上遇到了這個問題,我們從UTF-8源獲取數據並且不得不提供HTML頁面而無法控制Content-Type標題。實際上,我們最終編寫了一個自定義Java Charset,它可以將Java字符流轉換爲ASCII編碼字節流,並將所有非ASCII字符轉換爲實體。然後我們用一個Charset將輸出流封裝在Writer中,並像往常一樣輸出所有內容。在正確實現一個Charset的時候有幾個問題,但是簡單地做自己的編碼非常簡單,只要確保正確處理代理對。
它在您的平臺上的特定默認編碼(推測爲UTF-8)中長3個字節。 – 2012-07-06 14:09:16
是的,好點!將添加一個明確的編碼,使清晰... – DNA 2012-07-06 14:11:29