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