2013-10-30 84 views
1

我有一個字符集轉換問題:無法從字符集65535個字節轉換爲日本(5035)

我用下面的轉換方法更新在DB2日語漢字字符iSeries系統:

AS400 sys = new AS400("<host>","username","password"); 
CharConverter charConv = new CharConverter(5035, sys); 
byte[] b = charConv.stringToByteArray(5035, sys, "試験"); 
AS400Text textConverter = new AS400Text(b.length, 65535,sys); 

雖然檢索,我使用以下代碼來轉換&顯示:

CharConverter charConv = new CharConverter(5035, sys); 
byte[] bytes = charConv.stringToByteArray(5035, sys, dbRemarks); 
String s = new String(bytes); 
System.out.println("Remarks after conversion to AS400Text :"+s); 

但是,該系統被顯示亂碼而顯示。任何人都可以幫我解碼二進制存儲中的日文字符嗎?

+1

65535是「這是二進制數據 - 不翻譯」的CCSID。你真的想創建一個標記爲二進制數據的Java字符串嗎? –

+0

我想只顯示網頁中列的內容,對其進行編輯並更新回表格。 –

回答

1

非常感謝喬恩和巴克卡拉布羅!

有了您的線索,我已經成功地用以下方法:

String remarks = new String(resultSet.getBytes("remarks"),"SJIS"); 
byte[] byteData = remarks.getBytes("SJIS"); 
CharConverter charConv = new CharConverter(5035, sys); 
String convertedStr = charConv.byteArrayToString(5035, sys, byteData); 

我能夠從字符串轉換。我打算與JPA一起實施,並開始編碼。

3

好吧,我不知道CharConverterAS400Text什麼,但這樣的代碼幾乎總是錯誤的:

String s = new String(bytes); 

使用該平臺默認的編碼二進制數據轉換爲文本。

通常存儲和檢索應該通過相反的過程 - 所以當你已經開始一個字符串,然後將其轉換爲字節,並轉換,爲一個AS400Text對象存儲時,我希望你開始與一個AS400Text對象,將其轉換爲字節數組,然後在使用CharConverter時將其轉換爲String。在這兩種情況下您撥打stringToByteArray的事實表明存在一些不妥之處。

(這也將幫助,如果你能告訴我們什麼dbRemarks是,和你是如何獲取它。)

我也注意到,在檢查some documentation for AS400Text,我已經看到了這一點:

由於最近字符轉換例程的行爲發生了變化,除了將AS400Text對象作爲參數傳遞給Toolbox Proxy連接時,不再需要此係統對象。

還有類似的文檔CharConverter。你確定你確實需要在處通過這個?你是否試過直接存儲字符串並直接檢索它,而不經過中間步驟?

1

謝謝Jon Skeet!

是的。我犯了一個錯誤,沒有在聲明時編碼字符串。

我的問題是要獲取存儲在DB2中的數據,將其轉換爲日文並在網頁中進行編輯。我從結果集中獲取dbRemarks。我已經錯過了另一件事在我的帖子:

雖然插入,我轉換爲文本,如:

String text = (String) textConverter.toObject(b); 
PreparedStatement prepareStatementUpdate = connection.prepareStatement(updateSql); 
prepareStatementUpdate.setString(1, text); 
int count = prepareStatementUpdate.executeUpdate(); 

我能夠檢索和使用此代碼清晰地顯示:

String selectSQL = "SELECT remarks FROM empTable WHERE emp_id = ? AND dep_id=? AND join_date='2013-11-15' "; 
prepareStatement = connection.prepareStatement(selectSQL); 
prepareStatement.setInt(1, 1); 
prepareStatement.setString(2, 1); 
ResultSet resultSet = prepareStatement.executeQuery(); 
while (resultSet.next()) { 
    byte[] bytedata = resultSet.getBytes("remarks"); 
    AS400Text textConverter2 = new AS400Text(bytedata.length, 5035,sys); 
    String javaText = (String) textConverter2.toObject(bytedata); 
    System.out.println("Remarks after conversion to AS400Text :"+javaText); 
} 

它使用JDBC可以正常工作,但爲了使用JPA,我需要將其轉換爲字符串以在網頁中進行編輯或存儲在表中。所以,我嘗試過這種方式,但不能成功:

String remarks = resultSet.getString("remarks"); 
byte[] bytedata = remarks.getBytes(); 
AS400Text textConverter2 = new AS400Text(bytedata.length, 5035,sys); 
String javaText = (String) textConverter2.toObject(bytedata); 
System.out.println("Remarks after conversion to AS400Text :"+javaText); 
+0

'備註'是什麼樣子? Jon建議你根本不需要轉換。 –

+0

備註列是CHAR類型,用CCSID 9307編碼。所以,我以二進制格式更新爲65535. –

+0

我在我的參考資料中找不到CCSID(9307),但假設它是中文編碼,爲什麼要標記它作爲二進制數據?你不想從9307轉換爲你想要的日文編碼(5305)嗎? –

相關問題