JSP和Servlet對中文的處理過程(5)_JSP教程
推薦:困擾JSP的一些問題與解決方法如今每一個使用servlets的開發(fā)者都知道JSP,一種由Sun公司發(fā)明并花費大量精力加以推行并建構在servlet技術之上的web技術。JSP將servlet中的html代碼脫離了出來,從而可以加速web應用開發(fā)
CLASS文件中的中文表示法是不是昭然若揭了?OK,接下來看看CLASS又是怎樣輸出中文的呢?
Class:輸出字符串
上文說過,字符串在內存中表現(xiàn)為Unicode編碼。至于這種Unicode編碼表示了什么,那要看它是從哪種字符集映射過來的,也就是說要看它的祖先。這好比在托運行李時,外觀都是紙箱子,里面裝了什么就要看寄郵件的人實際郵了什么東西。
看看上面的例子,如果給一串Unicode編碼“00D6 00D0 00CE 00C4”,如果不作轉換,直接用Unicode碼表來對照它時,是四個字符(而且是特殊字符);假如把它與“ISO8859-1”進行映射,則直接去掉前面的“00”即可得到“D6 D0 CE C4”,這是ASCII碼表中的四個字符;而假如把它當作GB2312來進行映射,得到的結果很可能是一大堆亂碼,因為在GB2312中有可能沒有(也有可能有)字符與00D6等字符對應(如果對應不上,將得到0x3f,也就是問號,如果對應上了,由于00D6等字符太靠前,估計也是一些特殊符號,真正的漢字在Unicode中的編碼從4E00開始)。
各位看到了,同樣的Unicode字符,可以解釋成不同的樣子。當然,這其中有一種是我們期望的結果。以上例而論,“D6 D0 CE C4”應該是我們所想要的,當把“D6 D0 CE C4”輸出到IE中時,用“簡體中文”方式查看,就能看到清楚的“中文”兩個字了。(當然了,如果你一定要用“西歐字符”來看,那也沒辦法,你將得不到任何有何時何地的東西)為什么呢?因為“00D6 00D0 00CE 00C4”本來就是由ISO8859-1轉化過去的。
給出如下結論:
在Class輸出字符串前,會將Unicode的字符串按照某一種內碼重新生成字節(jié)流,然后把字節(jié)流輸入,相當于進行了一步“String.getBytes(???)”操作。???代表某一種字符集。
如果是Servlet,那么,這種內碼就是在HttpServletResponse.setContentType()方法中指定的內碼,也就是上文定義的。
如果是JSP,那么,這種內碼就是在中指定的內碼,也就是上文定義的。
如果是Java程序,那么,這種內碼就是file.encoding中指定的內碼,默認為ISO8859-1。
當輸出對象是瀏覽器時
以流行的瀏覽器IE為例。IE支持多種內碼。假如IE接收到了一個字節(jié)流“D6 D0 CE C4”,你可以嘗試用各種內碼去查看。你會發(fā)現(xiàn)用“簡體中文”時能得到正確的結果。因為“D6 D0 CE C4”本來就是簡體中文中“中文”兩個字的編碼。
OK,完整地看一遍。
JSP:源文件為GB2312格式的文本文件,且JSP源文件中有“中文”這兩個漢字
如果指定了為GB2312,轉化過程如下表。
表4 Jsp-charset = GB2312時的變化過程
序號
步驟說明
結果
1
編寫JSP源文件,且存為GB2312格式
D6 D0 CE C4
(D6D0=中 CEC4=文)
2
jspc把JSP源文件轉化為臨時JAVA文件,并把字符串按照GB2312映射到Unicode,并用UTF格式寫入JAVA文件中
E4 B8 AD E6 96 87
3
把臨時JAVA文件編譯成CLASS文件
E4 B8 AD E6 96 87
4
運行時,先從CLASS文件中用readUTF讀出字符串,在內存中的是Unicode編碼
4E 2D 65 87(在Unicode中4E2D=中 6587=文)
5
根據(jù)Jsp-charset=GB2312把Unicode轉化為字節(jié)流
D6 D0 CE C4
6
把字節(jié)流輸出到IE中,并設置IE的編碼為GB2312(作者按:這個信息隱藏在HTTP頭中)
D6 D0 CE C4
7
IE用“簡體中文”查看結果
“中文”(正確顯示)
如果指定了為ISO8859-1,轉化過程如下表。
表5 Jsp-charset = ISO8859-1時的變化過程
序號
步驟說明
結果
1
編寫JSP源文件,且存為GB2312格式
D6 D0 CE C4
(D6D0=中 CEC4=文)
2
jspc把JSP源文件轉化為臨時JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式寫入JAVA文件中
C3 96 C3 90 C3 8E C3 84
3
把臨時JAVA文件編譯成CLASS文件
C3 96 C3 90 C3 8E C3 84
4
運行時,先從CLASS文件中用readUTF讀出字符串,在內存中的是Unicode編碼
00 D6 00 D0 00 CE 00 C4
(啥都不是�。。。�
5
根據(jù)Jsp-charset=ISO8859-1把Unicode轉化為字節(jié)流
D6 D0 CE C4
6
把字節(jié)流輸出到IE中,并設置IE的編碼為ISO8859-1(作者按:這個信息隱藏在HTTP頭中)
D6 D0 CE C4
7
IE用“西歐字符”查看結果
亂碼,其實是四個ASCII字符,但由于大于128,所以顯示出來的怪模怪樣
8
改變IE的頁面編碼為“簡體中文”
“中文”(正確顯示)
分享:JavaBean 在jsp和serlvle中傳遞技術要點javaBean 在jsp和serlvle中的傳遞技術要點 一、 初始化javaBean 1、 在jsp中 在上一段的代碼中執(zhí)行過程如下: ? 按照scope的參數(shù)尋找相同id的javabean,如果找到了就跳出該; ?
- jsp response.sendRedirect不跳轉的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復習整理
- JSP腳本元素和注釋復習總結示例
- JSP FusionCharts Free顯示圖表 具體實現(xiàn)
- 網頁模板:關于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網站圖片路徑的問題:絕對路徑/虛擬路徑
- (jsp/html)網頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對路徑下的圖片解決方法
- 相關鏈接:
- 教程說明:
JSP教程-JSP和Servlet對中文的處理過程(5)
。