2011-07-18 108 views
1

從Oracle數據庫讀取特殊字符(使用JDBC驅動程序和glassfish tooplink)時,我遇到問題。從Oracle數據庫中讀取Java的特殊字符

我通過WebService在數據庫上存儲名稱「GRØNLÅENKJÆTIL」,並在數據庫上存儲了正確的數據。

但是當我讀到這個字符串,打印日誌文件,並轉換成這字節數組絲毫驗證碼:

int pos = 0; 
byte[] msg=new byte[1024]; 

String F = "F" + passenger.getName(); 
logger.debug("Add " + F + " " + F.length()); 
msg = addStringToArrayBytePlusSeparator(msg, F,pos); 

..............

private byte[] addStringToArrayBytePlusSeparator(byte[] arrDest,String strToAdd,int destPosition) 
    { 
     System.arraycopy(strToAdd.getBytes(Charset.forName("ISO-8859-1")), 0, arrDest, destPosition, strToAdd.getBytes().length); 

     arrDest = addSeparator(arrDest,destPosition+strToAdd.getBytes().length,1); 

     return arrDest; 
    } 

1)在日誌文件中有:「添加FGRÃNLÃ」(名稱不正確,F.length()未打印)。

2)代碼擲: java.lang.ArrayIndexOutOfBoundsException 在java.lang.System.arraycopy(本機方法) 在it.edea.ebooking.business.chi.control.VingCardImpl.addStringToArrayBytePlusSeparator(Test.java :225)。

任何解決方案?

坦克

+0

如果我在Windows操作系統中運行該項目,這工作正常,但在Linux系統上問題仍然存在! – Luigi

回答

3

你打電話strToAdd.getBytes()沒有指定字符編碼時,System.arraycopy調用內 - 將使用系統默認編碼,這很可能不是ISO-8859-1。你應該使用哪種編碼保持一致。坦率地說,我會建議你使用UTF-8而不是ISO-8859-1如果你有選擇,但這是一個不同的問題。

爲什麼你現在在處理字節數組?爲什麼不使用字符串?

另請注意,您的addStringToArrayBytePlusSeparator方法沒有給出它複製了多少字節的任何指示,這意味着調用者以後不知道該怎麼處理它。如果你必須使用這樣的字節數組,我建議使addStringToArrayBytePlusSeparator返回新的「邏輯數組結尾」或複製的字節數。例如:

private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); 

/** 
* (Insert fuller description here.) 
* Returns the number of bytes written to the array 
*/ 
private static int addStringToArrayBytePlusSeparator(byte[] arrDest, 
               String strToAdd, 
               int destPosition) 
{ 
    byte[] encodedText = ISO_8859_1.getBytes(strToAdd); 
    // TODO: Verify that there's enough space in the array 

    System.arraycopy(encodedText, 0, arrDest, destPosition, encodedText.length); 

    return encodedText.length; 
} 
0

編碼/解碼問題很難。在每個處理步驟中,您必須執行正確的編碼/解碼。所以,

  1. 熟悉字節(InputStream的)和性狀的差異(讀者,字符串)
  2. 選擇其中的字符編碼要存儲在數據庫中的數據,並在其中字符編碼,你想揭露你的web服務。確保當你加載數據庫中的初始數據時,它的編碼是正確的
  3. 連接正確的數據庫屬性。 mysql需要在連接url中加入:?useUnicode=true&characterEncoding=UTF-8,使用UTF-8時,我不知道oracle。
  4. 如果您在某個步驟打印/調試並且看起來沒問題,則無法確定您是否做得對。記錄器可以使用錯誤的編碼進行編寫(有時會使某些內容看起來不錯,但事實上它已經損壞)。您的終端可能無法正確處理奇怪的字節編碼。命令行數據庫客戶端也是如此。您的數據可能被錯誤地存儲,但您錯誤配置的終端將解釋/顯示數據爲正確的。
  5. 在XML中,它不僅僅是流編碼,還是xml編碼屬性。