2013-04-06 47 views
1

我有一個接受HTML內容作爲請求參數的一部分的servlet。 HTML是本地化的,可能是法文,西班牙文等等。 我也使用Apache HTTP客戶端做出這個servlet用於測試目的,其具有如下報頭定義的請求:通過apache HTTPClient傳遞特殊字符

HttpClient client = new HttpClient(); 

PostMethod method = new PostMethod("<URL>"); 
String html = FileUtils.readFileToString(inputHTMLFile, "UTF-8"); 
method.addParameter("html", html); 

method.addRequestHeader("Accept", "*/*");  
method.setRequestHeader("accept-charset", "UTF-8"); 

無論HTML被讀取具有的字符編碼UTF-8,示例文本:

Télécharger un fichier 

然而,當我從文本中要求PARAM獲取HTML變得T?l?charger un fichier

我通過幾個環節如http://www.oracle.com/technetwork/articles/javase/httpcharset-142283.html其中談到字符集和瀏覽器如何通常會去編碼特殊字符。如果我要使用UTF-8 URLEncode html,然後使用servlet中的相同字符集對其進行解碼,那麼我會按照預期獲取HTML。

這是我能做的唯一的事情來保存這些字符集嗎?我錯過了什麼嗎?

謝謝。現在

+0

是否已確認'html'是正確的對你從文件解碼之後呢?當你使用System.out.println(html)時,你可能會看到''''這意味着html文件不是UTF-8。字符x的存在並不意味着文件在編碼y中。該文件可以是任何支持字符x的編碼。 – Esailija 2013-04-06 11:32:08

+0

我現在正在爲法語和西班牙語正確無誤。我已經在notepad ++中將編碼更改爲utf-8。在獲取html後的servlet中,我使用FileUtils.writeStringToFile(new File(「c:\\ test.html」),message,「UTF-8」)將文件寫回到文件中。我可以很好地看到字符。但是對於中文,即使我從文件中讀取後在控制檯中正確地看到字符,在寫入期間它會轉換爲 – user320550 2013-04-06 14:18:44

回答

3

與該文件的問題本身是固定的,嘗試修改代碼如下:

HttpClient client = new HttpClient(); 
PostMethod postMethod = new PostMethod("<URL>"); 
postMethod.getParams().setContentCharset("utf-8"); //The line I added 

... 

注意,客戶現在需要對請求進行解碼爲UTF-8。法文和西班牙文正常工作,因爲它們的字符包含在默認的ISO-8859-1字符集中。漢字不是。如果法語和西班牙語在客戶端上正確解碼,則客戶端將該請求解碼爲ISO-8859-1,並且發送UTF-8可能會失敗。

所以,你可以嘗試也增加了這一點:

postMethod.setRequestheader("Content-Type", "application/x-www-form-url-encoded; charset=utf-8"); 
+0

感謝您的回覆。奇怪的是傳遞的html沒有進入請求參數,我嘗試做以下操作:method.addParameter(「html」,html);以及method.getParams()。setParameter(「html」,html);該參數爲空,不知道爲什麼 – user320550 2013-04-06 16:04:50

0

只是嘗試一下本作POST方法。

HttpPost request = new HttpPost(webServiceUrl); 
StringEntity str = new StringEntity(YourData); 
str.setContentType("application/json"); 
HttpPost.setEntity(new StringEntity(str, HTTP.UTF_8)); 
-1
PostMethod method = new PostMethod("URL"); 
method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");