2010-01-27 46 views
3

我在Oracle DB中將數據類型存儲爲blob(XML)。 我正在檢索此列並轉換爲字節[],然後轉換爲字符串。我做了一些字符串操作並將其轉換爲UTF-8格式並插入到數據庫中。一些特殊字符被插入爲垃圾字符。我真的不知道我做錯了什麼? 任何想法/幫助將不勝感激。將字符串轉換爲UTF-8字符時的奇怪行爲

這裏是源代碼。

 // DB COnnection 
    // Get the resultset 

    Blob data = (Blob) rs.getBlob(3); 
byte[] bdata = data.getBytes(1,(int)data.length()); 

// Converting to String and doing operation 
s = new String(bdata); 
// String operation 


// Before inserting into DB, converting to UTF-8 format. 
byte[] dataAsByteArray = s.getBytes("UTF8"); 
updateStmt.setBinaryStream(1, 
      new ByteArrayInputStream(dataAsByteArray),dataAsByteArray.length); 

commit(); 

回答

2

BLOB最初是否採用UTF-8格式?如果它是真的在XML中,我會使用XML API來讀取和解釋標頭。標題(如果存在)可以指定字符編碼。請參閱DocumentBuilder,並將BLOB作爲InputStream讀取以避免任何字節到字符轉換。在上述

注意,當你把它轉換爲字符串,不存在指定字節到字符編碼。

// Converting to String and doing operation 
s = new String(bdata); 

以上使用JVM運行時的默認字符集(doc here)。所以我認爲在上面有一些錯誤的可能性。我將確認BLOB的字符編碼,並在字符串轉換中強制執行字節到字符的編碼。

另外,我不記得,如果UTF8是除了有效的UTF-8指定的編碼。我想這可能是因爲我期望一個例外,但也許值得檢查。

+0

你說得對。我應該使用XML API來讀取和解釋標題。 我正在使用Javolution庫,它有一個名爲UTF8StreamReader的類。 我想用更快的方式上面的代碼填充一些虛擬/假數據用於測試目的,但似乎我必須堅持原來的方式:) – Anand 2010-01-27 00:24:06

+0

@布賴恩·阿格紐 - 規範名稱爲Sun Java 6級的編碼這裏列出: http://java.sun.com/javase/6/docs/technotes/guides/intl/encoding.doc.html – McDowell 2010-01-27 11:12:42

+0

@McDowell - 謝謝你。昨晚我找不到 – 2010-01-27 11:43:16