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

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

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

    風行天下

    JAVA太極
    posts - 4, comments - 10, trackbacks - 0, articles - 55
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Tomcat對String的編碼處理

    Posted on 2005-04-19 14:38 風太少 閱讀(260) 評論(0)  編輯  收藏
    Tomcat的中文處理(一)

    看到很多朋友問關于中文的處理問題,下面我們以tomcat4.0為servlet,jsp引擎來說說unicode的處理。

    1)       從客戶端接受請求

    當客戶端請求tomcat的一個jsp文檔的時候,tomcat會構造相應的httpServletRequest實現類的實例來代表客戶端,通過對流servletInputStream讀,我們可以得到客戶端來的數據。

       在jsp中我們通常使用的request.getParameter()來得到參數的值,這個函數的背后到底怎么樣的呢?怎么樣對String編碼的呢?

      通過tomcat的httpServletRequest實現類源代碼考察:

    public String getParameter(String name)

        {

            parseParameters();/////////處理parameters

            String values[] = (String[])parameters.get(name);//得到該參數名字對應的Object(是一個數組)

            if(values != null)

            {

                return values[0];

            } else

            {

                return null;

            }

        }


    其中parameters是request的一個map類型的數據成員,用來存放接受到的客戶端的數據。也就是說每當客戶端請求的時候,tomcat構造一個request實例,該實例有一個parameters用來存放從servlet實例的寫入流的讀來的客戶端的數據。

      從上面的代碼知道最重要的的是parseParameters()函數,它是來處理parameters的。

    下面來看看:

    protected void parseParameters()

        {

            if(parsed)

            {

                return;///如果處理過了,就不要處理了

            }

            ParameterMap results = parameters;/////構造parameters對象的本地引用

            if(results == null)

            {

                results = new ParameterMap();//////如果沒有實例

            }

      results.setLocked(false);

            String encoding = getCharacterEncoding();//////////////////////////得到httpServeltRequest的編碼

            if(encoding == null)

            {

                encoding = "ISO-8859-1";//////////如果沒有指定httpServeltRequest的編碼采用"ISO-8859-1"

            }

           。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

                RequestUtil.parseParameters(results, queryString, encoding);//////////////////////處理編碼

    。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

                                  

                    is.read(buf, len, max - len); //////////////////////從流中讀取數據

               。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

                    RequestUtil.parseParameters(results, buf, encoding);///////////////////////////////////處理編碼

             。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

            parameters = results;//////重置引用

        }


    下面再來看看RequestUtil.parseParameters(results, buf, encoding);/的處理:

    在此就不貼源代碼了,

    RequestUtil.parseParameters(results, buf, encoding)的處理中對于buf  byte數組進行處理,構造key和value,就是參數名字和參數值:

    while(ix < data.length) 

                {

                    byte c = data[ix++];

                    switch((char)c)

                    {

                    case 38: // '&'

                        value = new String(data, 0, ox, encoding);

                        if(key != null)

                        {

                            putMapEntry(map, key, value);

                            key = null;

                        }

                        ox = 0;

                        break;

     

                    case 61: // '='

        key = new String(data, 0, ox, encoding);

                        ox = 0;

                        break;

     

                    case 43: // '+'

                        data[ox++] = 32;

                        break;

     

                    case 37: // '%'

                        data[ox++] = (byte)((convertHexDigit(data[ix++]) << 4) + convertHexDigit(data[ix++]));

                        break;

     

                    default:

                        data[ox++] = c;

                        break;

                    }

                }

                if(key != null)

                {

                    value = new String(data, 0, ox, encoding);

                    putMapEntry(map, key, value);

                }

     

     

    顯然對于參數名字和參數的值都是采用的new String(data, 0, ox, encoding);方法來使用指定的編碼方式構造的。

    結論:我們不難看出如果沒有指定request的編碼方式,那么從客戶端接受到的參數的名字和參數值都是以iso-8859-1編碼的String的。

       也就是說我們在jsp的頁面中的表單元素中給出的參數值在通過request.getParamter()得到后的String是以iso-8859-1編碼的。

     

    而且我們看看tomcat為jsp產生的java文件知道,對于在jsp定義的沒有指定編碼方式的String的時候,tomcat是使用的iso-8859-1方式的,而不是系統默認的。

      比如:

    <%

    String name=new String(“你好”);或者String name=”你好”;/////都是使用的iso-8859-1的編碼方式的。

    System.out.println(name);/////////////////就會產生亂碼的。(因為Console使用的系統的默認編碼的,中文系統是gb2321,日文是MS932).

    %>

    下篇我們介紹httpServletResponse的處理



    bill-轉自:csdn


    參與論壇討論:http://www.matrix.org.cn/forum.asp
    更多技術文章:http://www.matrix.org.cn/article.asp
    Matrix java門戶:http://www.matrix.org.cn
    原文地址:http://www.matrix.org.cn/article/1430.html
    任何獲得許可轉載此文章,須在顯著位置標明Matrix的原文地址,并做鏈接至原文頁面,查看詳細的版權說明

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲中文字幕第一页在线| 最近在线2018视频免费观看| 无人视频免费观看免费视频| 亚洲av无一区二区三区| 亚洲国产无线乱码在线观看| 亚洲日本va一区二区三区| 亚洲中文字幕乱码一区| 亚洲欧美中文日韩视频| 亚洲中文字幕一二三四区| 亚洲最大的成人网站| 亚洲女女女同性video| 亚洲av片在线观看| 国产亚洲视频在线播放大全| 深夜a级毛片免费视频| 一个人看的www免费高清| 2022国内精品免费福利视频| 免费观看一区二区三区| 99国产精品免费视频观看| 国产a视频精品免费观看| 国产无人区码卡二卡三卡免费 | 久久大香香蕉国产免费网站| 最近高清中文字幕免费| 1000部啪啪未满十八勿入免费| 无码国产精品一区二区免费| 德国女人一级毛片免费| 免费观看午夜在线欧差毛片| 亚洲日韩在线观看免费视频| 久久亚洲国产中v天仙www| 久久久亚洲AV波多野结衣| 亚洲中文字幕无码一去台湾| 亚洲AV无码专区亚洲AV桃| 永久免费精品影视网站| 永久免费不卡在线观看黄网站| 91短视频免费在线观看| 日韩激情淫片免费看| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久亚洲精品无码| 日本亚洲精品色婷婷在线影院| 国产偷国产偷亚洲高清人| 嫩草在线视频www免费看| 色se01短视频永久免费|