掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
Servlet源文件到Class的過程

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供武威企業(yè)網(wǎng)站建設,專注與網(wǎng)站設計、網(wǎng)站建設、H5技術、小程序制作等業(yè)務。10年已為武威眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡公司優(yōu)惠進行中。
Servlet源文件是以“.java”結尾的文本文件。本節(jié)將討論Servlet的編譯過程并跟蹤其中的中文變化。
用“javac”編譯Servlet源文件。javac可以帶“-encoding < Compile-charset>”參數(shù),意思是“用< Compile-charset >中指定的編碼來解釋Serlvet源文件”。
源文件在編譯時,用< Compile-charset>來解釋所有字符,包括中文字符和ASCII字符。然后把字符常量轉變成Unicode字符,最后,把Unicode轉變成UTF。
在Servlet中,還有一個地方設置輸出流的CharSet。通常在輸出結果前,調用HttpServletResponse的 setContentType方法來達到與在JSP中設置< Jsp-charset>一樣的效果,稱之為< Servlet-charset>。
注意,文中一共提到了三個變量:< Jsp-charset>、< Compile-charset>和< Servlet-charset>。其中,JSP 文件只與< Jsp-charset>有關,而< Compile-charset>和< Servlet-charset>只與Servlet有關。
- 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編寫的,其中的“中文”兩個字保存為“D6 D0 CE C4”(GB2312編碼)。
開始編譯。下表是< Compile-charset>不同時,CLASS文件中“中文”兩字的十六進制碼。在編譯過程中,< Servlet- charset>不起任何作用。< Servlet-charset>只對CLASS文件的輸出產(chǎn)生影響,實際上是< Servlet-charset>和< Compile-charset>一起,達到與JSP文件中的< Jsp-charset>相同的效果,因為< Jsp-charset>對編譯和 CLASS文件的輸出都會產(chǎn)生影響。
“中文”從Servlet源文件到Class的轉變過程
Compile-charset Servlet源文件中 Class文件中 等效的Unicode碼
GB2312 D6 D0 CE C4
(GB2312) E4 B8 AD E6 96 87 (UTF) \u4E2D\u6587 (在Unicode中=“中文”)
ISO-8859-1 D6 D0 CE C4
(GB2312) C3 96 C3 90 C3 8E C3 84 (UTF) \u00D6 \u00D0 \u00CE \u00C4 (在D6 D0 CE C4前面各加了一個00)
無(默認) D6 D0 CE C4 (GB2312) 同ISO-8859-1 同ISO-8859-1
普通Java程序的編譯過程與Servlet完全一樣。
CLASS文件中的中文表示法是不是昭然若揭了?OK,接下來看看CLASS又是怎樣輸出中文的呢?
【編輯推薦】

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流