我在Oracle中有以下字符串(十六進制轉儲正好在它下面)。正如你所看到的,在第一個「N」之後,有一個僞造的字符「0xA6」。我的Oracle實例使用AL32UTF8作爲字符編碼。訪問Oracle數據庫的Java/C#程序,字符串中的字符串錯誤
FLOREN�PALACE HOTEL LTDA
Typ=1 Len=26: 46,4c,4f,52,45,4e,a6,41,20,50,41,4c,41,43,45,20,48,4f,54,45,4c,20,4c,54,44,41
我有兩個服務應該處理這個字符串 - 一個在C#中,另一個在Java中。我在C#中處理這個字符串,它說長度是27.然後我嘗試在Java中處理這個字符串,它說長度是25.當我使用C#打印時,它會打印(注意A和空格之前PALACE)
FLOREN�A PALACE HOTEL LTDA
而在Java中它打印與Oracle相同。
當我在Java程序中從Oracle中選擇字符串時,它就像是「吃」了0xA6及其後面的兩個字符並將其計爲一個字符。我認爲Java認爲它是一個UTF-8字符(這是字符集),所以它在「0xA6」之後消耗「A」和「」。
在將「A」和「」與「0xA6」進行分組時,是否有一種方法可以使Java不那麼激進?
讚賞任何建議,
MJ
編輯0
我看着那個獲取Oracle的串碼。我正在使用Oracle JDBC驅動程序。
Class.forName("oracle.jdbc.OracleDriver");
m_connection = DriverManager.getConnection(m_connectionString, m_username, m_password);
我的連接字符串是
jdbc:oracle:thin:@//192.168.0.18:1521/serviceName
對於真正從數據庫中獲取的字符串,我用的ResultSet的getBytes,的getString,getBinaryStream,getUnicodeStream方法調用。查看byte [],char []或字符串中的字節時,例如在使用getBytes時,會在0xA6,「A」和「」位置(0xEF,0xBF,0xBD)中顯示奇怪的字節。
/編輯0
你最近在做十六進制轉儲嗎?從一個從數據庫讀取的程序,或者從數據庫命令提示符本身? – 2013-02-22 18:27:09
我正在使用SQLDeveloper並運行以下SQL:從my_table中選擇foo,dump(foo,16) – 2013-02-22 18:28:25
如何檢索/處理字符串,特別是在Java中;可能有助於將代碼從數據庫中拉出來,直到獲取長度/打印它。而且,也許是你的語言環境。一些可重複的代碼會很好,如果這是可行的。你可以在StringBuffer中通過char來檢查它是char還是從數據庫檢索它作爲一個字節數組?或許有助於隔離JDBC是否令人困惑,或者之後的事情。數據庫中是「VARCHAR2」還是「NVARCHAR2」? (對不起,很多問題,只是傾銷的想法...!) – 2013-02-22 19:20:12