風行天下

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

          Tomcat對String的編碼處理

          Posted on 2005-04-19 14:38 風太少 閱讀(262) 評論(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的原文地址,并做鏈接至原文頁面,查看詳細的版權說明

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


          網站導航:
           
          主站蜘蛛池模板: 繁昌县| 龙陵县| 定远县| 云龙县| 塔城市| 纳雍县| 阿巴嘎旗| 昌宁县| 广丰县| 武汉市| 顺义区| 大庆市| 卢氏县| 云浮市| 长宁县| 临澧县| 成武县| 滨州市| 湘阴县| 涟水县| 建阳市| 阿城市| 台州市| 峨边| 宁津县| 登封市| 白河县| 衡东县| 黄大仙区| 北碚区| 英吉沙县| 洛宁县| 迭部县| 成安县| 上思县| 巴彦淖尔市| 黄龙县| 祁连县| 南木林县| 喀什市| 浪卡子县|