2008-10-30 78 views
0

我正在處理的應用程序從文件讀取信息以填充數據庫。文件中的一些字符是非英文的,例如重音法文字符。Java應用程序在特殊字符上失敗

該應用程序在Windows中正常工作,但在我們的Solaris機器上,它無法識別特殊字符並拋出異常。例如,當遇到在「Gérer」重音é它說: -

  Encountered: "\u0161" (353), after : "\'G\u00c3\u00a9rer les mod\u00c3"

(這是從我們的應用程序引發的異常)

我懷疑的是,爲了阻止這種情況發生,我需要更改JVM的file.encoding屬性。我試圖通過System.setProperty()來做到這一點,但它並沒有停止發生錯誤。

對於我能做什麼有什麼建議嗎?我正考慮將/ etc/default/init中solaris平臺的基本語言環境設置爲UTF-8。有人認爲這可能有幫助嗎?

任何想法都非常感謝。

回答

2

開始嘗試在兩個系統中的應用程序時使用

java -Dfile.encoding=UTF-8 ... 

解決此問題的另一種方法是將編碼從兩個系統更改爲UTF-8,但我更喜歡第一個選項(對系統的干擾較小)。

編輯:

檢查這個答案的計算器,它可以幫助之一:

Changing the default encoding for String(byte[])

+0

是的,我已經看到了。我唯一的問題是,我無法找到java命令實際運行的位置。這是因爲程序正在使用Ant來運行代碼。感謝您的回答,儘管我會嘗試使用它。 – Scottm 2008-10-30 17:20:00

0

您還可以設置在命令行編碼,像這樣java -Dfile.encoding=utf-8

4

看起來像使用錯誤的參數由native2ascii轉換的文件。爲了演示,創建一個帶有內容的文件

Gérer les modÚ 

並將其保存爲帶編碼UTF-8的「a.txt」。然後運行這個命令:

native2ascii -encoding windows-1252 a.txt b.txt 

打開新的文件,你應該看到這一點:

G\u00c3\u00a9rer les mod\u00c3\u0161 

現在相反的過程,但指定ISO-8859-1這個時候:

native2ascii -reverse -encoding ISO-8859-1 b.txt c.txt 

將新文件讀作UTF-8,您應該看到:

Gérer les modÀ\u0161 

它可以恢復「é」,但「Ú」上的扼流器與您的應用一樣。

我不知道你的應用出了什麼問題,但我很肯定不正確的使用native2ascii是它的一部分。這可能是讓應用程序使用系統默認編碼的結果。保存文本時應始終指定編碼,無論是文件還是數據庫,還是什麼 - 永遠不要默認。如果你沒有充分的理由選擇其他的東西,請使用UTF-8。

+0

好的答案 - 我會研究你的建議。謝謝 – Scottm 2008-10-31 10:29:04

1

而不是設置系統範圍的字符編碼,它可能更容易,更強大,在讀寫特定文本數據時指定字符編碼。你的應用程序如何閱讀這些文件?所有Java I/O包讀取器和編寫器都支持傳遞字符編碼名稱,以便在字節讀取/寫入文本時使用。如果您沒有指定,那麼它將使用平臺默認編碼,正如您可能遇到的一樣。

有些數據庫在他們可以接受的文本編碼中出人意料地受到限制。如果您的Java應用程序將文件作爲文本以適當的編碼方式讀取,那麼它可以將其輸出到數據庫,但它需要它。如果您的數據庫不支持任何其字符repetoire包含您所擁有的非ASCII字符的編碼,那麼您可能需要先編碼非英文文本,例如編碼爲UTF-8字節,然後Base64將這些字節編碼爲ASCII文本。

PS:不要使用String.getBytes(),因爲您看到的原因完全沒有字符編碼參數。

0

我想我們需要更多的信息,能夠幫助你解決問題:

  1. 什麼異常,你恰好有,且該方法在其發生時你叫。
  2. 什麼是輸入文件的編碼? UTF8? UTF-16/Unicode的? ISO8859-1?

如果您可以向我們提供相關的代碼片段,這也會很有幫助。

而且,幾件事情我想指出:

  1. 問題是不是在「E」,但後來發生的。
  2. 聽起來像字符編碼可能會在您的應用程序的某個地方被硬編碼。
+0

這個例外是在我們的軟件中定義的,它在解析器嘗試了所有內容但仍然不能識別字符時拋出。 它使用的編碼是系統默認值,默認設置爲en_GB.ISO8859-15。我正在尋找一種方法來強制應用程序讀取UTF8 – Scottm 2008-10-31 10:40:21

0

此外,您可能需要驗證是否安裝了支持UTF-8(SUNWeulux,SUNWeuluf等)的操作系統軟件包。

1

我設法通過運行命令

export LC_ALL='en_GB.UTF-8'

這個命令讓過去這個錯誤設置的語言環境,我在這個集合中的所有LC_環境變量設置爲Unicode文件編碼的外殼。

非常感謝您的所有建議。

0

Java在讀取和寫入文件時使用操作系統的默認編碼。現在,人們不應該依賴這一點。明確指定編碼總是一個好習慣。

在Java中,你可以使用下面的閱讀和寫作:

閱讀:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath),"UTF-8")); 

寫作:

PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8")));