2010-11-25 75 views
0

如何處理非英文文件名與非英文文件名

問題是我的程序不能保證那些目錄和文件名是英文的,如果一些文件名使用日文,中文字符,它會顯示一些字符'?'。

任何人都可以建議我笏我需要做的訪問非英語文件名

+0

哪種語言和平臺是那種? – 2010-11-25 09:12:38

+4

你的問題到底是什麼?你似乎在替換特殊字符,那麼問題是什麼? – 2010-11-25 09:21:24

+2

我會在這裏鈍。你還沒有確切地說明你的程序在做什麼以及它在哪裏遇到麻煩。顯示文件名有困難嗎?如果是這樣,它如何顯示文件名?它是使用Spring,JSF,Wicket等的Swing應用程序或Web應用程序嗎?從您提供的代碼中,我只能推斷出您正試圖阻止顯示「特殊」字符,如果您最終要處理ANSI或ISO-8859-1字符,則不應引起問題。 – 2010-11-25 12:20:47

回答

2

的Java本身使用Unicode - 你不需要更換特殊字符,爲Unicode 無特殊字符 - 每一個代碼點被平等對待。您的replaceSpChars()可能是這裏的罪魁禍首。

3

問題是我的程序無法保證這些目錄和文件名是英文的。如果一個文件名使用日文,中文字符將顯示一些像'?'的字符。

問題很明顯,「it」使用錯誤的字符集來顯示文件名。解決方案取決於「它」是否是您的程序(通過GUI),某個其他應用程序,命令外殼程序/終端仿真程序還是用戶的Web瀏覽器。如果你能提供更多信息,也許我可以提供一些建議。

但是將字符轉換爲下劃線很可能是一個不好的解決方案。這很容易導致文件名衝突,並且這些中文/日文/等字符對於創建文件的人最有可能是有意義的。

順便說一句,「英文」字母的正確術語是拉丁文。

編輯

爲您的使用情況,您不要使用帶有任何關係所提供的文件名的文件名保存PDF文件。我建議您嘗試使用由(例如)currentTimeInMillis()生成的拉丁數字和字母組成的文件名來解決問題。如果失敗了,那麼你真正的問題根本與文件名無關。

EDIT 2

你問有關語句

if (fileName.startsWith("=?iso-8859")) 

這似乎是試圖拆散的MIME encoded-word格式的文件名;請參閱RFC 2047 Section 2

首先,我認爲代碼可能是不必要的。 javadoc不是特定的,但我認爲Part.getFilename()方法應該處理文件名的解碼。

其次,如果解碼是必要的,那麼你就會以錯誤的方式去解決問題。字符集之後的內容不能簡單地視爲文件名的值。看看RFC。

三,如果您需要您應該使用相關的MimeUtility方法來解碼「單詞」標記......就像文件名。

第四,ISO-8859-1不適用於非拉丁字符集中的字符。

最後,檢查電子郵件的原始郵件的標題,你試圖解碼,並尋找開始

Content-Disposition: attachment; filename=... 

如果文件名看起來像「=?ISO-8859-1的標題行? ..「,並且文件名應該包含日文/中文/等字符,那麼問題出現在構建電子郵件的客戶端(或其他)中。字符集需要是「utf-8」或其他多字節字符集之一。