2011-06-07 42 views
3

當我嘗試上傳帶有瑞典字符的文件名的文件時,我正面臨編碼問題(我猜)。當我在Windows上上傳文件時,Applet工作正常,但在Mac OS上不上傳。Java小程序 - 無法將默認平臺編碼更改爲其他

文件名被搞砸時打印它在服務器端,這是一個Domino服務器,並顯示在Mac上盒,但是當我通過new String(filename.getBytes("utf-8"))將編碼設置爲UTF-8這表明?在雙贏和Mac。

更新:

以下是代碼片段:

設置請求參數和發佈

... 
request.setParameter("Name", tmpAtt.getFileName()); 
... 

HttpURLConnection connection ... 
connection.setRequestProperty("Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary); 

if (os == null) os = connection.getOutputStream(); 

文件名和文件的InputStream

request.setParameter(fileUploadFieldName, tmpAtt.getFilePath(), fi); 

public void setParameter(String name, String filename, InputStream is) throws IOException { 
    boundary(); 
    writeName(name); 
    write("; charset=utf-8; filename=\""); 
    write(filename); 
    write('"'); 
    newline(); 
    write("Content-Type:"); 
    String type = connection.guessContentTypeFromName(filename); 
    if (type == null) type = "application/octet-stream"; 
    writeln(type); 
    newline(); 
    pipe(is, os); 
    newline(); 
} 

設置PARAM在年底發佈到服務器

public InputStream post() throws IOException { 
    boundary(); 
    writeln("--"); 
    printOS(os); 
    os.close(); 
    InputStream iis = connection.getInputStream(); 
    printIS(iis); 
    return iis; 
} 

在寫入OutputStream上的字節以發送請求時獲取此輸出。名字對我來說很好。

------------------------------hxre3intl6yy-17eufpccwtxc89pbvyg0iwe3i 
Content-Disposition: form-data; name="Name 

Räpörå.log 
------------------------------hxre3intl6yy-17eufpccwtxc89pbvyg0iwe3i 
Content-Disposition: form-data; name="Name2 


------------------------------hxre3intl6yy-17eufpccwtxc89pbvyg0iwe3i 
Content-Disposition: form-data; name="APPROVALSTATUS 

可能是什麼問題。

謝謝。

回答

2

Java字符串始終在內部編碼爲UTF-16,但這與您的問題無關,並且嘗試「設置字符串的編碼」本身就是錯誤的。

編碼用於翻譯字符串和字節之間的。您的問題是,在完成此操作的某個時候,您沒有指定編碼,因此Java使用平臺默認編碼。

由於文件系統API是基於字符串,該問題不能在該端,所以filename字符串是在時間點很可能corruped你來自哪裏,用戶檢索它 - 或者是因爲有一種錯誤和毫無意義的嘗試另一個實例以「設置Java String的編碼」。

eclipse中的編碼設置僅與您的源代碼或作爲項目一部分的其他文件相關。

+0

我試圖將其編碼爲UTF-8,但沒有工作,之前我並沒有編碼任何東西。文件名字符串的損壞似乎是合乎邏輯的,但是當我在帖子之前打印該值時,它似乎很好。 – Deam 2011-06-07 13:47:11

+0

@ user330281:可能問題畢竟在文件系統方面。嘗試使用命令行參數-Dfile.encoding = UTF8運行問題(在eclipse運行配置中配置該參數)。總而言之,文件名中的非ASCII字符似乎仍然存在問題。我剛剛注意到非ASCII文件名被損壞,而只是在Windows PC和Linux NAS之間複製文件。 – 2011-06-07 14:14:46

+0

thx。對不起,我忘了提及我在瀏覽器中使用小程序,我想我不需要將上述參數放在eclipse的運行配置中,可能是瀏覽器中applet的解決方法。我應該通過將上面的參數作爲命令arg創建jar還是應該是標記中的參數?另一件事是,我發送請求到多米諾骨牌服務器,並希望它不會有任何問題... – Deam 2011-06-07 14:32:11

0

我剛剛將編碼方案更改爲ISO-8859-1

上面提到write("Content-Type:");方法是這樣的:

1. write(String s){ 
2. os.write(s.getBytes()); 
3. } 

我剛換2號線到os.write(s.getBytes("ISO-8859-1"))

它沒有與UTF-8工作,我不知道爲什麼???

方案正在某處變爲MacRoman因爲當我添加的ISO-8859-1架構以這種(如上所述)線request.setParameter("Name", new String(tmpAtt.getFileName().getBytes("ISO-8859-1")));,所述Name正在末亂碼。

但我不明白爲什麼UTF-8不工作,爲什麼計劃在中間的某個地方改變?

感謝您

+0

new String()使用平臺的默認編碼。正如我所說的:試圖將Java字符串「轉換」爲不同的編碼是根本錯誤的。至於爲什麼UTF-8不起作用:文件名是作爲請求的HTTP標題的一部分發送的,並且HTTP標題是由標準規定的隱含ISO-8859-1。所以你改變的write()方法現在是符合標準的。 – 2011-06-09 07:51:24