<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成人无码国产最大| 午夜无码A级毛片免费视频| 亚洲成人午夜电影| 国产亚洲欧洲Aⅴ综合一区 | 免费国产a国产片高清网站| 欧洲一级毛片免费| 久久免费精彩视频| jyzzjyzz国产免费观看| 亚洲AV第一成肉网| 亚洲高清一区二区三区| 亚洲精品国产第1页| 亚洲人成网亚洲欧洲无码久久| 一级毛片直播亚洲| 国产精品jizz在线观看免费| 在线v片免费观看视频| 中文免费观看视频网站| 97久久免费视频| 久久久精品2019免费观看| 成人黄网站片免费视频| a级黄色毛片免费播放视频| 国产视频精品免费视频| 永久免费无码日韩视频| 无码 免费 国产在线观看91| 国产成人亚洲综合a∨| 国产精品亚洲五月天高清| 亚洲精品伦理熟女国产一区二区| 亚洲影视自拍揄拍愉拍| 亚洲一级特黄特黄的大片 | 四虎国产成人永久精品免费| 999zyz**站免费毛片| 国产综合免费精品久久久| 中文字幕免费在线看电影大全 | 亚洲欧洲无码AV电影在线观看| 亚洲片国产一区一级在线观看| 亚洲国产香蕉人人爽成AV片久久| 亚洲 无码 在线 专区| 红杏亚洲影院一区二区三区| 亚洲精品无码久久久久sm| 国产精品亚洲成在人线| 亚洲激情中文字幕| 亚洲一区二区三区深夜天堂|