<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的原文地址,并做鏈接至原文頁面,查看詳細的版權說明

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


    網站導航:
     
    主站蜘蛛池模板: 色吊丝性永久免费看码| 久久久久久亚洲精品成人| 亚洲日韩国产AV无码无码精品| 亚洲AV男人的天堂在线观看| 五月婷婷综合免费| 亚洲永久网址在线观看| 欧美男同gv免费网站观看| 亚洲精品无码不卡在线播放| 成年午夜视频免费观看视频| 亚洲精品美女久久7777777| 国产精品冒白浆免费视频| 特级aa**毛片免费观看| 亚洲精品麻豆av| 久久久久久影院久久久久免费精品国产小说 | 一级毛片**不卡免费播| 亚洲精品人成电影网| 国产成人免费网站| 蜜桃传媒一区二区亚洲AV | 国产成人综合亚洲亚洲国产第一页| 国产99久久久国产精免费| 亚洲天天在线日亚洲洲精| 好男人www免费高清视频在线| 亚洲精品无码少妇30P| 亚洲中文字幕成人在线| 99ee6热久久免费精品6| 色天使亚洲综合在线观看| 波多野结衣中文一区二区免费| 中文字幕成人免费高清在线视频| 夜夜亚洲天天久久| 日本高清免费网站| 久久99热精品免费观看动漫| 亚洲资源最新版在线观看| 亚洲精品无码专区久久同性男| 84pao强力永久免费高清| 亚洲精品理论电影在线观看| 在线日韩日本国产亚洲| 最新仑乱免费视频| 中文字幕久精品免费视频| 国产成人精品日本亚洲网址| 国产亚洲人成网站在线观看| 久久久久久免费视频|