Servlet源文件的轉(zhuǎn)移
Servlet源文件是以“.Java”結(jié)尾的文本文件。我們將討論Servlet的編譯過程并跟蹤其中的中文變化。
用“Javac”編譯Servlet源文件。Javac可以帶“-encoding ”參數(shù),意思是“用< Compile-charset >中指定的編碼來解釋Servlet源文件”。
源文件在編譯時,用來解釋所有字符,包括中文字符和ASCII字符。然后把字符常量轉(zhuǎn)變成Unicode字符。最后,把Unicode轉(zhuǎn)變成UTF。
在Servlet中,還有一個地方設(shè)置輸出流的CharSet。通常在輸出結(jié)果前,調(diào)用HttpServletResponse的setContent Type方法來達(dá)到與在JSP中設(shè)置一樣的效果,稱之為。
注意:文中一共提到了三個變量:、和。其中,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編寫的,其中的“中文”兩個字保存為字節(jié)流“D6 D0 CE C4”(GB2312編碼)。
開始編譯。Class文件中“中文”兩字的十六進(jìn)制碼。在編譯過程中,不起任何作用。只對Class文件的輸出產(chǎn)生影響,可以說和一起,達(dá)到與JSP文件中的相同的效果,因為對編譯過程和Class文件的輸出都會產(chǎn)生影響。
從Servlet源文件到Class的轉(zhuǎn)變過程
注意:普通Java程序的編譯過程與Servlet完全一樣。
截止現(xiàn)在,從JSP或Servlet源文件到Class文件的過程中中文內(nèi)容的蛻變歷程是不是昭然若揭了?OK,接下來看看Class文件中的中文又是怎樣被輸出的呢?
Class:輸出字符串
Class文件是Java程序的一種存儲載體。當(dāng)Class文件被虛擬機(jī)執(zhí)行時,通過readUTF把Class文件中的內(nèi)容讀入內(nèi)存中。字符串在內(nèi)存中表示為Unicode編碼。當(dāng)要把內(nèi)存中的內(nèi)容輸出到別的程序或是外圍設(shè)備(如終端)上去時,問題就來了(為了簡單起見,把“別的程序或外圍設(shè)備”稱之為“輸出對象”)。
1.如果輸出對象能處理Unicode字符,則一切都很簡單,只要把Unicode字符直接傳給輸出對象即可。
2.事實是,大多數(shù)輸出對象不能直接處理Unicode,它們只能處理ISO8859-1和GB2312等。在往輸出對象輸出字符串時,需要做一定的轉(zhuǎn)換才行。
看看下面的例子,給定一個有四個字符的Unicode字符串“00D6 00D0 00CE 00C4”,如果輸出到只能識別“ISO8859-1”的程序中去,則直接去掉前面的“00”即可得到目的字符串“D6 D0 CE C4”。假如把它們輸出到GB2312的程序中去,得到的結(jié)果很可能是一大堆亂碼。因為在GB2312中可能沒有(也有可能有)字符與00D6等字符對應(yīng)(如果對應(yīng)不上,將得到0x3f,也就是問號,如果對應(yīng)上了,由于00D6等字符太靠前,估計也是一些特殊符號,真正的漢字在Unicode中的編碼從 4E00開始)。
同樣的Unicode字符,輸出到不同編碼的對象中去時,結(jié)果是不同的。當(dāng)然,這其中有一種是我們期望的結(jié)果。對于能處理中文的輸出對象而言,自然希望輸入的內(nèi)容(也就是Java程序輸出的內(nèi)容)是基于GB2312編碼有意義的中文字符串。
以上Servlet源文件的例子而論,“D6 D0 CE C4”應(yīng)該是我們所想要的。當(dāng)把“D6 D0 CE C4”輸出到IE中時,用“簡體中文”方式查看,就能看到清楚的“中文”兩個字了。
【編輯推薦】