2012-09-14 68 views
2

我有一個Java類,可以將Windows客戶端的文本文件上傳到Linux服務器。如何使用java上傳文件而不更改其編碼

我上傳的文件是使用Cp1252或ISO-8859-1編碼的。

當文件上傳時,它使用utf-8進行編碼,然後包含像éà這樣的口音的字符串不能被讀取。

在Linux服務器命令

file -i * 

告訴我,這是一個使用UTF-8編碼。

我覺得編碼改爲diring上傳,所以我說這個代碼到我的servlet:

String currentEncoding=System.getProperty("file.encoding"); 
System.setProperty("file.encoding", "Cp1252"); 
item.write(file); 
System.setProperty("file.encoding", currentEncoding); 

在JSP文件中,我有這樣的代碼:

<form name="formUpload" 
action="..." method="post" 
enctype="multipart/form-data" accept-charset="ISO-8859-1"> 

的LIB我使用上傳文件是apache commun。

Doe的任何一個人都有一個線索,因爲我真的跑出了主意!

感謝,

Otmane MALIH

+0

請記住,您提供的servlet代碼可能在真實環境中引入奇怪的副作用......記住併發客戶端(系統屬性是全局的)。 – home

+0

我知道,我拿走了那些代碼,我只是試圖強制文件在ISO-8859-1中進行編碼,但沒有奏效。 –

回答

2

設置系統屬性file.encoding當您啓動Java才起作用。相反,你將不得不打開該文件與此代碼:

public static BufferedWriter createWriter(File file, Charset charset) throws IOException { 
    FileOutputStream stream = new FileOutputStream(file); 
    return new BufferedWriter(new OutputStreamWriter(stream, charset)); 
} 

使用Charset.forName("iso8859-1")作爲charset參數。

[編輯]你的問題很可能是file命令。 MacOS是世界上唯一可以自信地告訴你文件編碼的操作系統。 Windows和Linux必須猜測。這個猜測可能是錯誤的。

所以你需要做的是用指定編碼的編輯器打開文件。您需要在Windows上執行此操作(以確保文件確實已保存爲Cp1252;某些應用程序忽略該平臺並始終保護其數據在UTF-8中)。

而你需要在Linux上也這樣做。如果您只是打開文件,編輯器將採用平臺編碼(在現代Linux系統上爲UTF-8),並嘗試用該文件讀取該文件 - >ISO-8859-1變音符將會出現亂碼。但是如果你用ISO-8859-1打開文件,那麼UTF-8會出現亂碼。這是確定文本文件的編碼究竟是什麼的唯一方法。

+0

我也試過,但是FileItem item.write(File file)並沒有將BufferedWriter作爲參數。 –

+0

您需要修復'item.write()'中的代碼。除此之外,無法解決此錯誤。 –

+2

它是Commons FileUpload API的一部分。這不能是「只是」固定:)忽略這一點,我不認爲OP正在尋找解決方案的正確方向。 Common FileUpload絕對不會在'FileItem#write()'過程中解碼/編碼文件。它只是從未修改的網絡檢索字節中流出。在文件寫入後,客戶端或服務器端都會導致問題。 – BalusC

相關問題