新聞中心
Servlet源文件是以“.Java”結(jié)尾的文本文件。我們將討論Servlet的編譯過(guò)程并跟蹤其中的中文變化。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到淇濱網(wǎng)站設(shè)計(jì)與淇濱網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋淇濱地區(qū)。
用“Javac”編譯Servlet源文件。Javac可以帶“-encoding ”參數(shù),意思是“用< Compile-charset >中指定的編碼來(lái)解釋Servlet源文件”。
源文件在編譯時(shí),用來(lái)解釋所有字符,包括中文字符和ASCII字符。然后把字符常量轉(zhuǎn)變成Unicode字符。最后,把Unicode轉(zhuǎn)變成UTF。
在Servlet中,還有一個(gè)地方設(shè)置輸出流的CharSet。通常在輸出結(jié)果前,調(diào)用HttpServletResponse的setContent Type方法來(lái)達(dá)到與在JSP中設(shè)置一樣的效果,稱之為。
注意:文中一共提到了三個(gè)變量:、和。其中,JSP文件只與有關(guān),而和只與Servlet有關(guān)。
看下例:
- import Javax.servlet.*;
- import Javax.servlet.http.*;
- Class testServlet extends HttpServlet
- {
- public void doGet(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,Java.io.IOException
- {
- resp.setContentType("text/html; charset=GB2312");
- Java.io.PrintWriter out=resp.getWriter();
- out.println("");
- out.println("#中文#");
- out.println("");
- }
- }
該文件也是用UltraEdit for Windows編寫的,其中的“中文”兩個(gè)字保存為字節(jié)流“D6 D0 CE C4”(GB2312編碼)。
開始編譯。Class文件中“中文”兩字的十六進(jìn)制碼。在編譯過(guò)程中,不起任何作用。只對(duì)Class文件的輸出產(chǎn)生影響,可以說(shuō)和一起,達(dá)到與JSP文件中的相同的效果,因?yàn)閷?duì)編譯過(guò)程和Class文件的輸出都會(huì)產(chǎn)生影響。
從Servlet源文件到Class的轉(zhuǎn)變過(guò)程
注意:普通Java程序的編譯過(guò)程與Servlet完全一樣。
截止現(xiàn)在,從JSP或Servlet源文件到Class文件的過(guò)程中中文內(nèi)容的蛻變歷程是不是昭然若揭了?OK,接下來(lái)看看Class文件中的中文又是怎樣被輸出的呢?
Class:輸出字符串
Class文件是Java程序的一種存儲(chǔ)載體。當(dāng)Class文件被虛擬機(jī)執(zhí)行時(shí),通過(guò)readUTF把Class文件中的內(nèi)容讀入內(nèi)存中。字符串在內(nèi)存中表示為Unicode編碼。當(dāng)要把內(nèi)存中的內(nèi)容輸出到別的程序或是外圍設(shè)備(如終端)上去時(shí),問(wèn)題就來(lái)了(為了簡(jiǎn)單起見(jiàn),把“別的程序或外圍設(shè)備”稱之為“輸出對(duì)象”)。
1.如果輸出對(duì)象能處理Unicode字符,則一切都很簡(jiǎn)單,只要把Unicode字符直接傳給輸出對(duì)象即可。
2.事實(shí)是,大多數(shù)輸出對(duì)象不能直接處理Unicode,它們只能處理ISO8859-1和GB2312等。在往輸出對(duì)象輸出字符串時(shí),需要做一定的轉(zhuǎn)換才行。
看看下面的例子,給定一個(gè)有四個(gè)字符的Unicode字符串“00D6 00D0 00CE 00C4”,如果輸出到只能識(shí)別“ISO8859-1”的程序中去,則直接去掉前面的“00”即可得到目的字符串“D6 D0 CE C4”。假如把它們輸出到GB2312的程序中去,得到的結(jié)果很可能是一大堆亂碼。因?yàn)樵贕B2312中可能沒(méi)有(也有可能有)字符與00D6等字符對(duì)應(yīng)(如果對(duì)應(yīng)不上,將得到0x3f,也就是問(wèn)號(hào),如果對(duì)應(yīng)上了,由于00D6等字符太靠前,估計(jì)也是一些特殊符號(hào),真正的漢字在Unicode中的編碼從 4E00開始)。
同樣的Unicode字符,輸出到不同編碼的對(duì)象中去時(shí),結(jié)果是不同的。當(dāng)然,這其中有一種是我們期望的結(jié)果。對(duì)于能處理中文的輸出對(duì)象而言,自然希望輸入的內(nèi)容(也就是Java程序輸出的內(nèi)容)是基于GB2312編碼有意義的中文字符串。
以上Servlet源文件的例子而論,“D6 D0 CE C4”應(yīng)該是我們所想要的。當(dāng)把“D6 D0 CE C4”輸出到IE中時(shí),用“簡(jiǎn)體中文”方式查看,就能看到清楚的“中文”兩個(gè)字了。
網(wǎng)站題目:Servlet源文件的轉(zhuǎn)移
地址分享:http://www.dlmjj.cn/article/dpgeies.html


咨詢
建站咨詢
