<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題

    本文為原創(chuàng),如需轉載,請注明作者和出處,謝謝

        有個朋友寫JSP程序時,在Servlet中取請求參數(shù)時出現(xiàn)了亂碼,當然,這種亂碼問題再簡單不過了。由于在JSP中使用了GBK作用頁面的編碼,那么提交的中文信息自然也會被按著GBK進行編碼,為%xx格式的GBK編碼。
        要解決這個問題可以說是方法多多。最簡單的就是使用request.setCharacterEncoding方法設置編碼格式,如下面的代碼所示:

    request.setCharacterEncoding("GBK");

        在設置完編碼格式之后,就可以直接通過request.getParameter方法來獲得請求參數(shù)中的中文信息了。當然,為了方便,還可以在過濾器中加入上面的語句,這樣所有的Servlet都可以直接使用
    request.getParameter方法來獲得請求參數(shù)中的中文信息了。 除了這兩種方法,還可以不使用request.setCharacterEncoding("GBK"),而使用下面的語言來轉換編碼:

    String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

        但為了更快解決這個問題,我就直接告訴這位朋友使用了setCharacterEncoding方法來設置編碼。但是說來奇怪,還是出現(xiàn)亂碼,沒有任何解決問題的跡象。 最郁悶的事就是使用了自己認為100%能解決問題的方法,而這種方法卻一點都沒起作用。
        最后又讓朋友試了最后一種方法,說來奇怪,竟然好使了。當然,這也沒什么可奇怪的,本來就應該好使,但奇就奇在setCharacterEncoding方法并沒有去掉,也就是說,同時使用了下面兩條語句,竟然得到了正常的中文請求參數(shù)值:

    request.setCharacterEncoding("GBK");
    String name 
    = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
    System.out.println(name);  
    //  正常輸出中文請求參數(shù)

        按著常理來說,這是不可能的,既然使用了setCharacterEncoding方法設置成了GBK,再使用
    new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")來轉換,得到的應該是?????,不可能是正常的中文,只有將setCharacterEncoding方法去了,以ISO-8859-1格式保存的字符串才可以用ISO-8859-1格式還原,再用GBK重新保存成Java字符串(這一步實際上就是GBK轉Unicode)。

        但經(jīng)過仔細思考后,決定看下JSP代碼是如何寫的。不看不知道,一看嚇一跳,原來<form>在提交時使用的是GET,而未用POST,這當然沒什么了不起的,用什么都可以,但對編碼就有問題了。自從Tomcat5.x開始,GET和POST方法提交的信息,Tomcat采用了不同的方式來處理編碼,對于POST請求,Tomcat會仍然使用request.setCharacterEncoding方法所設置的編碼來處理,如果未設置,則使用默認的iso-8859-1編碼。而GET請求則不同,Tomcat對于GET請求并不會考慮使用
    request.setCharacterEncoding方法設置的編碼,而會永遠使用iso-8859-1編碼,而這位朋友使用的正好是GET請求,因此,tomcat將會使用iso-8859-1將提交的字節(jié)轉換成字符串。

    解決的方法有兩個:
    1.  將GET請求改成POST請求,然后就可以使用
    request.setCharacterEncoding方法設置編碼,并使用request.getParameter方法直接獲得中文請求參數(shù)了。
    2.  不用改GET請求,在Servlet中使用如下的代碼來得到中文請求參數(shù)。

    String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

        綜上所述,如果使用了GET請求,則setCharacterEncoding方法不起作用,只能使用上面的代碼來解決,而使用POST請求,盡管
    setCharacterEncoding方法起作用,但使用上面的代碼仍然好使(在這時不能使用setCharacterEncoding方法將編碼格式設置成非iso-8859-1格式)。因此,如果想讓Servlet可以同時處理GET和POST請求中的中文信息,除了判斷這兩種方法外,還可以使用上面的代碼來同時處理這兩種請求的中文信息。

        筆者建議使用如下的代碼來獲得中文請求參數(shù):

    String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

        因為上面的代碼是利用了Java的編碼能力,對于所有的Web服務器都會有效,而setCharacterEncoding方法是通過Web服務器支持的,并不是所有的Web服務器都會對該方法有很好的支持。





    Android開發(fā)完全講義(第2版)(本書版權已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-09-05 15:48 銀河使者 閱讀(3063) 評論(8)  編輯  收藏 所屬分類: javaweb 原創(chuàng)

    評論

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   


    我還真以為你發(fā)現(xiàn)了什么。
    2008-09-05 19:44 | 隨便

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   

    只是解釋一下為什么最好用String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");,哈哈。
    2008-09-05 20:03 | 銀河使者

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   

    tomcat就是有這樣很變態(tài)的問題.
    新人學習中....
    2008-09-12 00:19 | 樓上兩位很垃圾

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   

    謝謝。確實很大幫助。其他網(wǎng)頁上通常說在server.xml中設置URIEncoding就可以,但事實上不起作用。采用筆者使用的方法成功了。 我使用的是Tomcat 6。
    2008-09-25 20:46 | 專吃飯右手

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   

    一直搞不明白為什么request.setCharacterEncoding("GBK")不起作用,看了這篇文章,茅塞頓開。
    2008-10-05 10:14 | 文濤

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   

    好!
    2008-10-24 16:05 | lyshyhaungli

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   

    j2ee的API里說的很清楚
    setCharacterEncoding
    public void setCharacterEncoding(java.lang.String env)
    throws java.io.UnsupportedEncodingExceptionOverrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().
    有什么疑問請參考http://rubyeye.javaeye.com/blog/266705

    # re: Tomcat在處理GET和POST請求時產(chǎn)生的亂碼問題  回復  更多評論   

    真是太感謝這篇樓主了,這篇帖子很棒!
    2009-05-31 19:12 | 茅塞頓開
    主站蜘蛛池模板: 亚洲国产区男人本色| 一区二区免费在线观看| 哒哒哒免费视频观看在线www| 在线免费观看一级毛片| 日本高清高色视频免费| 亚洲av午夜成人片精品电影| 久久亚洲最大成人网4438| 青青青国产在线观看免费| 久久久久久AV无码免费网站 | 亚洲国产精品成人AV在线| 99在线精品视频观看免费| 无码日韩精品一区二区免费暖暖| 亚洲综合图色40p| 中文字幕一精品亚洲无线一区| 国产V片在线播放免费无码| 色久悠悠婷婷综合在线亚洲| 亚洲AV日韩精品一区二区三区| 国产av天堂亚洲国产av天堂 | 37pao成人国产永久免费视频| 亚洲成AV人片在线观看无| 久久国产亚洲精品麻豆| 久久久久久亚洲精品中文字幕| 我的小后妈韩剧在线看免费高清版| 亚洲AV无码精品无码麻豆| 亚洲欧洲日产国码久在线| 免费a在线观看播放| 亚洲精品你懂的在线观看| 日韩欧美亚洲中文乱码| 亚洲精品不卡视频| 国产亚洲色视频在线| 69国产精品视频免费| 日日夜夜精品免费视频| 亚洲免费视频播放| 一区免费在线观看| 91精品国产免费久久国语麻豆| 亚洲AV无码成人网站久久精品大| 免费无码黄十八禁网站在线观看 | 亚洲欧洲国产精品香蕉网| 国产资源免费观看| 亚洲精品视频在线免费| 香蕉国产在线观看免费|