鍍金池/ 問答/Linux/ Servlet中文亂碼 Tomcat8

Servlet中文亂碼 Tomcat8

問題:

Servlet中Get和Post獲取到的中文參數(shù)都變成了亂碼

代碼:

JSP:
    <meta charset="UTF-8">
    <html>
    <body>
    <h2>Hello World!</h2>
    <form action="/login" method="post">
        username:<input type="text" name="username"><br/>
        pwd:<input type="password" name="pwd"><br/>
        <input type="submit" value="login" />
    </form>
    </body>
    </html>

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    String pwd = request.getParameter("pwd");
    System.out.println(username + " " + pwd);
}

截圖:

clipboard.png
clipboard.png

嘗試方法:

如圖 request使用setCharacterEncoding設(shè)置為了UTF-8 并且當(dāng)前頁面編碼也是UT-8 JSP文件也加入了UTF-8的編碼聲明 環(huán)境用的是Tomcat8
回答
編輯回答
凝雅

檢查一下編碼

  • 打開文件
  • 修改編碼
code
by soarkey
2017年6月6日 02:27
編輯回答
刮刮樂
  1. 應(yīng)該盡量避免在URL中使用非ASCII 字符,不然可能會(huì)碰到亂碼問題,最好在我們的服務(wù)器端設(shè)置中的URIEncoding 和useBodyEncdingForURI 兩個(gè)參數(shù)
  2. 一定要在第一次調(diào)用request.getParameter 方法之前就設(shè)置request .setCharacterEncoding(charset),否則你的POST 表單提交上來的數(shù)據(jù)也可能出現(xiàn)亂碼
2018年7月6日 17:09
編輯回答
愛礙唉

java文件,jsp文件編碼方式最好都統(tǒng)一使用UTF-8編碼。

對(duì)于post請(qǐng)求
設(shè)置request .setCharacterEncoding(“UTF-8”),這樣中文才不會(huì)有亂碼!

你可以統(tǒng)一寫一個(gè)過濾器設(shè)置一下,如果使用spring-mvc的話 可以在web.xml中配置

<filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

對(duì)于get請(qǐng)求
如果你的請(qǐng)求是get,參數(shù)有中文的,比如 ?name=張上,按照如下處理
前端encodeURIComponent(encodeURIComponent(url)),對(duì)url進(jìn)行二次編碼。
后端:拿到參數(shù)值,使用URLDecoder.decode(s, "UTF-8")解碼一下。這樣方式確實(shí)可行的,答主在實(shí)際項(xiàng)目總使用過。
舉個(gè)例子吧:
前端:

<script type="text/javascript">
   var url = "/xxx/param/test";
     
     var name = "張上";
     
     name = encodeURIComponent(name);
     name = encodeURIComponent(name);//二次編碼
     alert(name);
     url = url + "?name="+name;
     window.location.href = url;
     </script>

后端:

@Controller
@RequestMapping(value="/param")
public class ParamController extends BaseController<ParamEntity> {
    /**
     * @throws UnsupportedEncodingException 
     * 
     */
    @RequestMapping(value="/test",method=RequestMethod.GET)
    public String test(@RequestParam("name") String name) throws UnsupportedEncodingException{
        name = URLDecoder.decode(name, "UTF-8");//實(shí)測,可以正確的得到中文。
        System.out.println(name);
        return "index";
    }
}

注意:get請(qǐng)求有中文參數(shù),可以指定容器使用何種編碼規(guī)則來解碼提交的參數(shù)(有人回答使用這種方式,即修改tomcat 配置文件中的Connector中的URIEncoding參數(shù)),但是這種做法不建議使用,推薦使用二次編碼吧。
為什么需要二次編碼?可以看如下博文:
eURIComponent編碼2次

2018年4月29日 20:34
編輯回答
神經(jīng)質(zhì)

修改下conf下server
clipboard.png

2018年5月3日 03:27
編輯回答
浪蕩不羈

很尷尬.... 瀏覽器默認(rèn)采用了ASCII進(jìn)行解碼, 調(diào)整瀏覽器解碼方式為UTF-8即可

2017年1月11日 21:46