2009-06-23 78 views
5

我有一個CSV文件,其中包含ASCII & Unicode字符。說「ÅÔÉA」。我不確定這個文件的編碼格式,但是當我在記事本中打開它時,它顯示「ANSI」作爲它的編碼標準。Java中的編碼問題

我以UTF-8編碼格式獲取這些CSV內容。 (新的FileInputStream(文件名),「UTF-8」);新的InputStreamReader(新的FileInputStream(文件名),「UTF-8」);

但是當我在DB中存儲這些特殊字符,除了「A」,沒有正確存儲。字符得到加擾

我希望所有的字符都能正確存儲。任何想法?

+0

使用十六進制編輯器/傾卸器檢查文件看看哪些字節實際上代表那些非ASCII字符。 – laalto 2009-06-23 06:41:30

回答

0

你的數據庫字段是否支持unicode?在MSSQL中,字段類型必須是varchar over varchar。你使用的是哪個數據庫?

6

「記事本」中的「ANSI」表示您的Windows正在使用的任何代碼頁。 嘗試ISO8859-1,它在大多數情況下工作。

1

我建議創建一個小程序,它從文件中讀取並打印出所讀取字符的Unicode值,這樣可以確保顯示的值是正確的。在http://www.unicode.org/charts/有代碼圖 - 您可能可以使用基本拉丁和拉丁-1圖表。

我的猜測是編碼是本地Windows編碼。然後,您可以完全避免「UTF-8」參數,並讓Java使用默認的平臺編碼。

2

有這個問題。你需要兩樣東西:對PreparedStatement的NVARCHAR2列和Oracle特定的方法調用以通知的字符串編碼預言:

/** 
* Sets a statement parameter as NCHAR. Use before setting the field value. 
* @param pstmt the prepared statement 
* @param index the parameter index 
*/ 
public static void setNChar(PreparedStatement pstmt, int index) { 
    OraclePreparedStatement opstmt = (OraclePreparedStatement)pstmt; 
    opstmt.setFormOfUse(index, OraclePreparedStatement.FORM_NCHAR); 
} 

如果使用普通的SQL字符串使用Unicode字符,可以作爲甲骨文得到所有的SQL命令UTF-8:驅動程序自動翻譯。但是,對於準備好的語句使用你需要明確地告訴oracle。

如果您運行Java 6並具有ojdbc6驅動程序,您也可以嘗試PreparedStatement.setNString()。 (在我的情況下,我們必須使用Java 5與版本4驅動程序 - 不要問爲什麼)

(注意:我知道這是供應商鎖定,因爲您被迫使用具體的oracle類而不是jdbc接口)

2

首先,你需要知道文件的編碼。用hexeditor打開它。一個字符佔用多少字節?如果它只有一個,那麼該文件不是UTF-8,而更可能是某些ISO-8859或類似的Windows編碼(例如Win-1252)。如前所述,機會是ISO-8859-1是正確的編碼。對於東歐語言,ISO-8859-2將是正確的選擇。

第二個問題是您的數據庫支持字符列的字符集(該參數在安裝/創建新實例期間設置),但由於您可以直接插入這些字符,因此在這種情況下它不會成爲問題。

您使用哪個jdbc驅動程序?如果客戶端的NLS_LANG設置與數據庫的字符編碼不匹配,那麼精簡驅動程序不應該在這方面發生任何問題,而OCI驅動程序可能會產生額外的問題層。

+0

我認爲Oracle 10g允許您爲國家字符集列存儲格式使用UTF-8或UTF-16。默認情況下它是UTF-16。 – akarnokd 2009-06-23 08:23:56

+0

kd304:您還可以指定UTF-8作爲CHAR(VARCHAR,VARCHAR2)列的字符集,因此數據庫中的每個字符串都是UTF8。 – 2009-06-23 08:58:34

0

您需要在ISO 8859-1中編碼,而不是在UTF-8中編碼。

+1

如果他/她以UTF-8接收數據,他/她爲什麼要將其轉碼爲較小的格式? Oracle能夠處理unicode文本。 – akarnokd 2009-06-23 08:25:32

0

您可以手動比較字符輸出的十六進制轉儲和各種編碼(sample code),雖然這可能是一個費力的過程。或者,您可以使用ICU庫嘗試使用determine the encoding,雖然這不是一個簡單的方法。

CSV文件是如何生成的?如果它是由英文OS上的Windows應用程序創建的,則編碼可能是windows-1252canonical name "Cp1252" in Java);在波蘭系統上,它可能是windows-1250。最好的方法是找出保存文件的編碼方式。

0

第一件要做的事情就是從文件中加載字符串的System.out.println()。如果它在控制檯中損壞,那麼你的文件實際上並不是UTF-8,如果它看起來很好,那麼你將它保存到數據庫的方式有問題:)