2013-05-13 72 views
27

我看到很多像我這樣的問題,但沒有一個答案的作品... 這是事情:我想從請求中獲取我的參數(帶有口音的字符),但它不起作用。我試圖用戶request.setCharacterEncoding("UTF-8"),但它也沒有工作。HttpServletRequest UTF-8編碼

我知道URLDecoder.decode(request.getQueryString(), "UTF-8")返回我的權利字符,但request.getParameterValues()不起作用! 有沒有人有想法?

謝謝

回答

34

保羅的建議似乎是最佳行動過程,但如果你要解決它,你並不需要的URLEncoder或URLDecoder都:

String item = request.getParameter("param"); 

byte[] bytes = item.getBytes(StandardCharsets.ISO_8859_1); 
item = new String(bytes, StandardCharsets.UTF_8); 

// Java 6: 
// byte[] bytes = item.getBytes("ISO-8859-1"); 
// item = new String(bytes, "UTF-8"); 

更新:由於這是得到大量的選票,我想強調BalusC的觀點,這絕對不是一個解決方案;這是一個最好的解決方法。人們不應該這樣做。

我不知道到底是什麼原因引起的問題,但我懷疑這個URL已經是UTF-8編碼了,然後又是UTF-8編碼了。

+9

對於所有未來的讀者,請注意,這是一種解決方法,而不是解決方案。事實上,這是一個非常糟糕的問題,它會讓你的webapp變得脆弱和不可移植。 – BalusC 2014-12-27 10:07:03

+0

你說得對,謝謝指出!也幫助我解決問題 – Broccoli 2017-02-25 19:51:40

15

如果您正在使用Apache Tomcat,request.setCharacterEncoding("UTF-8")只有POST要求的作品。

對於GET請求,您需要在的<Connector>上添加URIEncoding="UTF-8"

查看更多的FAQ/CharacterEncoding - Tomcat Wiki

+0

WebSphere Application Server如何?我可否知道server.xml位於WAS中的哪個文件夾?我搜索整個,發現有很多server.xml。 – 2016-04-06 06:46:55

+0

對於WebSphere,您需要使用系統屬性'client.encoding.override'。請參閱https://www.ibm.com/support/knowledgecenter/en/ssw_i5_54/rzatz/51/admin/help/trun_svr_utf.html – 2017-12-26 19:32:05

5

嗯,我找到了一種方法來解決我的問題,我想這是不是更好的解決方案,但它確實工作..

String item = request.getParameterValues("param"); // Hélène 
    item = URLEncoder.encode(model.getNameItem(), "ISO-8859-1"); // H%C3%A9l%C3%A8ne 
    item = URLDecoder.decode(item, "UTF-8"); // and finally : Hélène 

如果它可以幫助別人,我很樂意幫助: )

PS:保羅,我以前沒有回答你,但我已經做了這些事情。無論如何,感謝您的幫助。

+0

從Paul答覆,我可以知道server.xml位於WAS中的哪個文件夾?我搜索整個,發現有很多server.xml。 – 2016-04-06 06:47:49

+0

爲我工作,thx。我無法修改Tomcat服務器,所以這是完美的:) – 2016-09-27 15:09:58