JSP和Servlet對(duì)中文的處理過程(7)_JSP教程
推薦:困擾JSP的一些問題與解決方法如今每一個(gè)使用servlets的開發(fā)者都知道JSP,一種由Sun公司發(fā)明并花費(fèi)大量精力加以推行并建構(gòu)在servlet技術(shù)之上的web技術(shù)。JSP將servlet中的html代碼脫離了出來(lái),從而可以加速web應(yīng)用開發(fā)
如果不指定Compile-charset或Servlet-charset,其默認(rèn)值均為ISO8859-1。
當(dāng)Compile-charset=Servlet-charset時(shí),第2步和第4步能互逆,“抵消”,顯示結(jié)果均能正確。讀者可試著寫一下Compile-charset<>Servlet-charset時(shí)的情況,肯定是不正確的。
當(dāng)輸出對(duì)象是數(shù)據(jù)庫(kù)時(shí)
輸出到數(shù)據(jù)庫(kù)時(shí),原理與輸出到瀏覽器也是一樣的。本節(jié)只是Servlet為例,JSP的情況請(qǐng)讀者自行推導(dǎo)。
假設(shè)有一個(gè)Servlet,它能接收來(lái)自客戶端(IE,簡(jiǎn)體中文)的漢字字符串,然后把它寫入到內(nèi)碼為ISO8859-1的數(shù)據(jù)庫(kù)中,然后再?gòu)臄?shù)據(jù)庫(kù)中取出這個(gè)字符串,顯示到客戶端。
表9 輸出對(duì)象是數(shù)據(jù)庫(kù)時(shí)的變化過程(1)
序號(hào)
步驟說明
結(jié)果
域
1
在IE中輸入“中文”
D6 D0 CE C4
IE
2
IE把字符串轉(zhuǎn)變成UTF,并送入傳輸流中
E4 B8 AD E6 96 87
3
Servlet接收到輸入流,用readUTF讀取
4E 2D 65 87(unicode)
Servlet
4
編程者在Servlet中必須把字符串根據(jù)GB2312還原為字節(jié)流
D6 D0 CE C4
5
編程者根據(jù)數(shù)據(jù)庫(kù)內(nèi)碼ISO8859-1生成新的字符串
00 D6 00 D0 00 CE 00 C4
6
把新生成的字符串提交給JDBC
00 D6 00 D0 00 CE 00 C4
7
JDBC檢測(cè)到數(shù)據(jù)庫(kù)內(nèi)碼為ISO8859-1
00 D6 00 D0 00 CE 00 C4
JDBC
8
JDBC把接收到的字符串按照ISO8859-1生成字節(jié)流
D6 D0 CE C4
9
JDBC把字節(jié)流寫入數(shù)據(jù)庫(kù)中
D6 D0 CE C4
10
完成數(shù)據(jù)存儲(chǔ)工作
D6 D0 CE C4 數(shù)據(jù)庫(kù)
以下是從數(shù)據(jù)庫(kù)中取出數(shù)的過程
11
JDBC從數(shù)據(jù)庫(kù)中取出字節(jié)流
D6 D0 CE C4
JDBC
12
JDBC按照數(shù)據(jù)庫(kù)的字符集ISO8859-1生成字符串,并提交給Servlet
00 D6 00 D0 00 CE 00 C4 (Unicode)
13
Servlet獲得字符串
00 D6 00 D0 00 CE 00 C4 (Unicode)
Servlet
15
編程者必須根據(jù)數(shù)據(jù)庫(kù)的內(nèi)碼ISO8859-1還原成原始字節(jié)流
D6 D0 CE C4
16
編程者必須根據(jù)客戶端字符集GB2312生成新的字符串
4E 2D 65 87
(Unicode)
Servlet準(zhǔn)備把字符串輸出到客戶端
17
Servlet根據(jù)生成字節(jié)流
D6 D0 CE C4
Servlet
18
Servlet把字節(jié)流輸出到IE中,如果已指定,還會(huì)設(shè)置IE的編碼為
D6 D0 CE C4
19
IE根據(jù)指定的編碼或默認(rèn)編碼查看結(jié)果
“中文”(正確顯示)
IE
解釋一下,表中第4第5步和第15第16步是用紅色標(biāo)記的,表示要由編碼者來(lái)作轉(zhuǎn)換。第4、5兩步其實(shí)就是一句話:“new String(source.getBytes("GB2312"), "ISO8859-1")”。第15、16兩步也是一句話:“new String(source.getBytes("ISO8859-1"), "GB2312")”。親愛的讀者,你在這樣編寫代碼時(shí)是否意識(shí)到了其中的每一個(gè)細(xì)節(jié)呢?
至于客戶端內(nèi)碼和數(shù)據(jù)庫(kù)內(nèi)碼為其它值時(shí)的流程,和輸出對(duì)象是系統(tǒng)控制臺(tái)時(shí)的流程,請(qǐng)讀者自己想吧。明白了上述流程的原理,相信你可以輕松地寫出來(lái)。
行文至此,已可告一段落了。終點(diǎn)又回到了起點(diǎn),對(duì)于編程者而言,幾乎是什么影響都沒有。
因?yàn)槲覀冊(cè)缇捅桓嬷@么做了。
以下給出一個(gè)結(jié)論,作為結(jié)尾。
1、 在Jsp文件中,要指定contentType,其中,charset的值要與客戶端瀏覽器所用的字符集一樣;對(duì)于其中的字符串常量,不需做任何內(nèi)碼轉(zhuǎn)換;對(duì)于字符串變量,要求能根據(jù)ContentType中指定的字符集還原成客戶端能識(shí)別的字節(jié)流,簡(jiǎn)單地說,就是“字符串變量是基于字符集的”;
2、 在Servlet中,必須用HttpServletResponse.setContentType()設(shè)置charset,且設(shè)置成與客戶端內(nèi)碼一致;對(duì)于其中的字符串常量,需要在Javac編譯時(shí)指定encoding,這個(gè)encoding必須與編寫源文件的平臺(tái)的字符集一樣,一般說來(lái)都是GB2312或GBK;對(duì)于字符串變量,與JSP一樣,必須“是基于字符集的”。
分享:JavaBean 在jsp和serlvle中傳遞技術(shù)要點(diǎn)javaBean 在jsp和serlvle中的傳遞技術(shù)要點(diǎn) 一、 初始化javaBean 1、 在jsp中 在上一段的代碼中執(zhí)行過程如下: ? 按照scope的參數(shù)尋找相同id的javabean,如果找到了就跳出該; ?
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實(shí)現(xiàn)
- 網(wǎng)頁(yè)模板:關(guān)于jsp頁(yè)面使用jstl的異常分析
- JSP頁(yè)面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項(xiàng)目中連接Access數(shù)據(jù)庫(kù)的配置方法
- JDBC連接Access數(shù)據(jù)庫(kù)的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對(duì)路徑/虛擬路徑
- (jsp/html)網(wǎng)頁(yè)上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對(duì)路徑下的圖片解決方法
JSP教程Rss訂閱編程教程搜索
JSP教程推薦
- Servlet和Filter的url匹配url-pattern
- 用JSP來(lái)發(fā)送郵件
- CNET JSP BASICJSP的內(nèi)部對(duì)象
- 利用HSQLDB來(lái)進(jìn)行Hibernate的單元測(cè)試
- 網(wǎng)頁(yè)無(wú)閃自動(dòng)局部刷新實(shí)例
- 在無(wú)線J2ME設(shè)備上實(shí)現(xiàn)HTTP協(xié)議1
- JSP由淺入深6—— JSP聲明
- Servlet+Jsp實(shí)現(xiàn)圖片或文件的上傳功能具體思路及代碼
- 用J2ME在移動(dòng)設(shè)備上實(shí)現(xiàn)動(dòng)畫1
- 揭秘幾個(gè)提升JSP應(yīng)用程序效率的小方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-JSP和Servlet對(duì)中文的處理過程(7)
。