2012-07-06 128 views
2

我們在DB中有一個clob列。現在,當我們提取這個clob並嘗試顯示它(純文本而不是html)時,它會在html屏幕上打印一些垃圾文字。當直接傳輸到一個文件中的字符看起來像(不是一般的雙普通鍵盤上的引號)字符編碼問題?

一個多觀察:

System.out.println("」".getBytes()[0]); 

打印-108

爲什麼一個字符字節應該在負的範圍內?有什麼方法可以在html屏幕上正確顯示它嗎?

回答

2

回覆:您的最後一點 - 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類 。

+0

它在您的平臺上的特定默認編碼(推測爲UTF-8)中長3個字節。 – 2012-07-06 14:09:16

+0

是的,好點!將添加一個明確的編碼,使清晰... – DNA 2012-07-06 14:11:29

2

我認爲,這將是更好的打印像這樣的字符代碼:

System.out.println((int)'」');//result is 8221 

This link可以幫你解釋這個非同尋常的雙引號(包括HTML代碼)。

0

要獲得關於HTML文檔中正確顯示字符的問題,你需要做兩件事情之一:要麼設置文檔的編碼或實體IZE非ASCII字符。

要設置編碼,您有兩個選項。

  1. 更新您的Web服務器在 的Content-Type頭髮送適當的字符集參數。正確的標題將是Content-Type: text/html; charset=UTF-8
  2. 一個<meta charset="UTF-8" />標籤添加到您的 頁面的頭部。

請記住,選項1將優先選項2.即如果您已經在標題中設置了不正確的字符集,則無法用元標記覆蓋它。

另一種選擇是實體化非ASCII字符。對於您問題中的引號字符,您可以使用&rdquo;&#8221;&#x201D;。第一個是用戶友好的命名實體,第二個用十進制指定字符的Unicode代碼點,第三個用十六進制指定代碼點。所有的都是有效的,所有的都可以。

通常,如果您要從包含未知字符的數據庫中實體化動態內容,最好使用實體的代碼點版本,因爲您可以輕鬆編寫一種方法將任何字符> 127到適當的代碼點。

我目前正在處理的一個系統實際上遇到了這個問題,我們從UTF-8源獲取數據並且不得不提供HTML頁面而無法控制Content-Type標題。實際上,我們最終編寫了一個自定義Java Charset,它可以將Java字符流轉換爲ASCII編碼字節流,並將所有非ASCII字符轉換爲實體。然後我們用一個Charset將輸出流封裝在Writer中,並像往常一樣輸出所有內容。在正確實現一個Charset的時候有幾個問題,但是簡單地做自己的編碼非常簡單,只要確保正確處理代理對。