2010-06-12 123 views
29

我有一些UTF-8的問題。我的客戶(在GWT實現)提出請求,以我的servlet,在URL中的一些參數應用,如下:request.getQueryString()似乎需要一些編碼

http://localhost:8080/servlet?param=value 

當我取回URL servlet的,我有一些問題,UTF-8字符。 我用這個代碼:

protected void service(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException { 

     request.setCharacterEncoding("UTF-8"); 

     String reqUrl = request.getRequestURL().toString(); 
     String queryString = request.getQueryString(); 
     System.out.println("Request: "+reqUrl + "?" + queryString); 
     ... 

所以,如果我把這個網址:

http://localhost:8080/servlet?param=così 

的結果是這樣的:

Request: http://localhost:8080/servlet?param=cos%C3%AC 

我能做些什麼來設置正確的字符編碼?

回答

27

我以前遇到過這個問題。不知道你使用的是什麼Java servlet容器,但至少在Tomcat 5.x中(不確定大約是6.x)request.setCharacterEncoding()方法對GET參數沒有影響。當你的servlet運行時,GET參數已經被Tomcat解碼,所以setCharacterEncoding不會做任何事情。

兩種方式來解決這個問題:

  1. 更改的URIEncoding您的連接器設置爲UTF-8。見http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

  2. 由於BalusC建議您自己解碼查詢字符串,並手動將它解析(而不是使用ServletRequest API)到您自己的參數映射中。

希望這有助於!

+4

#1中的URIEncoding設置位於Tomcat的server.xml中。其他servlet容器應合理地具有相同的設置。 – schematic 2010-06-12 17:10:48

+1

對於#2,您不能再使用request.getParameter()方法,因爲該方法將檢索錯誤解碼的參數。您必須將解碼後的查詢字符串(由getQueryString()生成)手動解析(例如,按照&符號分割字符'&',然後將結果字符串拆分第一個等號'=')。 – schematic 2010-06-12 17:13:52

+2

我遇到了server.xml設置的問題。在Windows機器上它工作正常,但在我們生產的基於Red Hat的機器上,Tomcat似乎忽略了server.xml設置。我們最終不得不實現我們自己的查詢參數解析器,它使用UTF-8明確解碼它。 – Herms 2010-06-12 17:29:01

28

HttpServletRequest#getQueryString() javadoc

返回: 包含查詢字符串或null如果URL中不包含查詢字符串的字符串。 該值不由容器解碼。

請注意最後一條語句。所以你需要URL-decode它你自己使用java.net.URLDecoder

String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8"); 

但是,收集參數的正常方法是使用HttpServletRequest#getParameter()

String param = request.getParameter("param"); // così 

servletcontainer已經爲您進行了網址解碼,然後如果您已經配置它使用正確的編碼。 request.setCharacterEncoding()僅對請求主體(POST)有效,而不在請求URI(GET)上。另請參閱Mirage的答案。

+0

如果我使用他們的工作URLDecoder,但是當我只想檢索使用getParameter()的參數,他們沒有工作..有什麼建議? – Gabriele 2010-06-12 17:08:07

+1

您需要設置Mirage114解釋的服務器URI編碼。另請參閱[本文](http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html#JSPServletRequest) – BalusC 2010-06-12 17:13:09

+1

所以'getParameter()'不會調用'URLDecoder.decode ()'某個地方? – 2012-10-06 22:12:36

20

這真的花了一整天,但:

final String param = new String(request.getParameter("param").getBytes(
       "iso-8859-1"), "UTF-8"); 

又見here。請注意,這是有效的當且僅當服務器的解碼字符集(URIEncoding在Tomcat中)被iso-8859-1 - 否則此charset必須傳入有關如何從server.xml獲得URIEncoding字符集爲Tomcat 7的例子中看到我的報價answer

+0

這是依賴於服務器的默認字符集是UTF-8;而是將該字符集傳遞給字符串構造函數。你也不需要URL解碼來自'getParameter'的任何東西。 – bobince 2013-06-20 14:12:56

+0

@bobince:你說的很對(我知道) - 我還沒有找到時間去閱讀我的答案 - 編輯 – 2013-06-20 14:25:23

+2

這節省了我的一天! – NumberFour 2015-05-26 21:22:36

1

影響http請求params編碼的因素很多。你可以參考這個問題的順序指南。

1.選中表單的接受字符編碼。

<form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8"> 

2.檢查http服務器的默認字符編碼值。 在apache http服務器的情況下,將"AddDefaultCharset UTF-8"字符串添加到httpd.conf文件。

3.如果您有後端服務器,請檢查後端服務器的字符編碼值。 在Tomcat中後端服務器的情況下,增加 「的URIEncoding =」 UTF-8" 屬性到你的連接器。像,

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> 

...

guide for http request parameter encoding problems

3

對於POST請求我解決了問題下方式

  1. 集的URIEncoding = 「UTF-8」 server.xml中爲連接器ATTR;(I使用Tomcat 8)
  2. 在參數檢索前設置request.setCharacterEncoding(「UTF-8」)。

最後,我得到了正確的utf-8字符deliery: String name = request.getParameter(「name」);

名稱包含正確的utf-8字符串。

-1
pRes.setContentType("text/html; charset=UTF-8"); 
PrintWriter out = new PrintWriter(new (pRes.getOutputStream(), "UTF8"), true); 

使用上面的代碼中,我得到了預期的結果:)