2012-06-29 57 views
2

此問題涉及連接到MySQL(5.5.16)數據庫的Tomcat 7 Web應用程序。使用從壓縮文件中的文件名派生的特殊字符

當我打開一個zip文件,已在windows-1252字符集編碼的文件名,人物似乎被Java正確解釋:

ZipFile zf = new ZipFile(zipFile, Charset.forName("windows-1252")); 
Enumeration entries = zf.entries(); 
while(entries.hasMoreElements()) { 
    ZipEntry ze = (ZipEntry) entries.nextElement(); 
    if(! ze.isDirectory()) { 
     String name = ze.getName(); 
     System.out.println(name); //prints correct filenames, e.g. café.pdf 
    } 
} 

忽略的zip文件的構造函數的字符集對象會導致異常 。 壓縮文件中的文件名被正確輸出到標準輸出,包括變音符號。 但是,當我隨後嘗試將文件名存儲在數據庫中時,e-acute被替換爲問號(如使用mysql控制檯客戶端所看到的)。 我沒有問題從Web應用程序插入到MySQL之前的特殊字符。

當我執行與Java源代碼é一個INSERT:

statement.executeUpdate("insert into files (filename) values ('café.pdf')"); 

é下都很MySQL中。

而且,我的日誌文件顯示了一個逗號,而不是é: caf‚.pfd

有誰知道什麼可能會發生在這裏?

+0

如何打開與MySQL服務器的連接?你使用什麼類/庫/服務? – SkyDan

+0

要連接Java與MySQL我使用javax.sql.DataSource資源與:driverClassName =「com.mysql.jdbc.Driver」url =「jdbc:mysql:// localhost:3306/workflow?zeroDateTimeBehavior = convertToNull」 – reus

+0

請,從Java應用程序執行以下查詢。向我們展示了輸出:'顯示的變量,比如 '字符%'' – SkyDan

回答

0

問題已解決。 This post建議zip文件中的文件名編碼可能不是windows-1252,而是IBM437。改變Charset從:

ZipFile zf = new ZipFile(zipFile, Charset.forName("windows-1252")); 

ZipFile zf = new ZipFile(zipFile, Charset.forName("IBM437")); 

,得到所期望的結果:在保存在MySQL所獲取的文件名時,它被正確地存儲及eacute ;.

出了什麼問題?

打印出包含在ZIP文件到標準輸出文件名與

System.out.println(name); 

讓我錯誤地認爲,在壓縮文件的文件名被解釋得好:當我用windows-1252編碼來打開壓縮文件,文件名被打印到標準輸出,很好地使用了變音符:café .pdf。使用其他字符編碼,出現了不同的符號而不是eacute ;.

但打印的&eacute的Unicode值時; - charthis answer的幫助下,我能看到,隨着windows-1252編碼打開壓縮文件時,實際Unicode值不是\u00e9(拉丁小字母e與急性),但\u201a(單低9引號)。當我用IBM437字符集打開ZipFile時,出現正確的Unicode值DID。

當然,當打印StringPrintStream的標準輸出時,PrintStream還與某個字符編碼相關聯。來自PrintStream Javadoc:

由PrintStream打印的所有字符都使用平臺的默認字符編碼轉換爲字節。

我正在使用Windows XP。 當我創建了一個新的PrintStream

out = new PrintStream(System.out, true, "IBM437"); 

一切是有道理的:打開與IBM437字符編碼的壓縮文件,並使用新的PrintStream,é打印正確。

There Ain't No Such Thing As Plain Text.

0

在你存儲數據的表,一定要使用正確的排序規則,以便能夠存儲電子急性字符

+0

他說直接查詢成功了,這意味着服務器端的一切都可以。 – SkyDan

1

正如你在評論部分中提到,輸入數據(壓縮文件的名稱)可以在不同的字符集。這對你來說是一個問題,因爲你正在使用MySQL + JDBC鏈接,並且它給你提供了很多限制(比如MySQL中的每列一個字符集,以及JDBC中每個連接只有一個字符集)。因此,我建議您將MySQL端的字符集(查找像character_set_servercharacter_set_connection這樣的變量)切換爲UTF8,因爲它可以讓您傳輸和存儲幾乎所有可能接收到的字符。關於如何正確設置MySQL服務器,請參見here。請注意,MySQL服務器的設置可能具有挑戰性,所以請不要猶豫,以獲得更多幫助。 JDBC將自動調整爲服務器的character_set_connection變量,因此您不必在Java應用程序中更改任何內容。

你將不得不在你的應用程序中改變一件事,你將不得不將所有傳入的數據轉換爲UTF8,以便將其發送並存儲到MySQL服務器上。

祝你好運。

相關問題