亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

深入剖析JSP和Servlet對中文的處理

2024-09-05 00:19:16
字體:
來源:轉載
供稿:網友
世界上的各地區都有本地的語言。地區差異直接導致了語言環境的差異。在開發一個國際化程序的過程中,處理語言問題就顯得很重要了。

  這是一個世界范圍內都存在的問題,所以,java提供了世界性的解決方法。本文描述的方法是用于處理中文的,但是,推而廣之,對于處理世界上其它國家和地區的語言同樣適用。

  漢字是雙字節的。所謂雙字節是指一個雙字要占用兩個byte的位置(即16位),分別稱為高位和低位。中國規定的漢字編碼為gb2312,這是強制性的,目前幾乎所有的能處理中文的應用程序都支持gb2312。gb2312包括了一二級漢字和9區符號,高位從0xa1到0xfe,低位也是從0xa1到0xfe,其中,漢字的編碼范圍為0xb0a1到0xf7fe。

  另外有一種編碼,叫做gbk,但這是一份規范,不是強制的。gbk提供了20902個漢字,它兼容gb2312,編碼范圍為0x8140到0xfefe。gbk中的所有字符都可以一一映射到unicode 2.0。

  在不久的將來,中國會頒布另一種標準:gb18030-2000(gbk2k)。它收錄了藏、蒙等少數民族的字型,從根本上解決了字位不足的問題。注意:它不再是定長的。其二字節部份與gbk兼容,四字節部分是擴充的字符、字形。它的首字節和第三字節從0x81到0xfe,二字節和第四字節從0x30到0x39。

  本文不打算介紹unicode,有興趣的可以瀏覽“http://www.unicode.org/”查看更多的信息。unicode有一個特性:它包括了世界上所有的字符字形。所以,各個地區的語言都可以建立與unicode的映射關系,而java正是利用了這一點以達到異種語言之間的轉換。

  在jdk中,與中文相關的編碼有:

  表1 jdk中與中文相關的編碼列表

編碼名稱說明
ascii7位,與ascii7相同
iso8859-18-位,與 8859_1,iso-8859-1,iso_8859-1,latin1...等相同
gb2312-8016位,與gb2312,gb2312-1980,euc_cn,euccn,1381,cp1381, 1383, cp1383, iso2022cn,iso2022cn_gb...等相同
gbk與ms936相同,注意:區分大小寫
utf8與utf-8相同
gb18030與cp1392、1392相同,目前支持的jdk很少


  在實際編程時,接觸得比較多的是gb2312(gbk)和iso8859-1。

  為什么會有“?”號

  上文說過,異種語言之間的轉換是通過unicode來完成的。假設有兩種不同的語言a和b,轉換的步驟為:先把a轉化為unicode,再把unicode轉化為b。

  舉例說明。有gb2312中有一個漢字“李”,其編碼為“c0ee”,欲轉化為iso8859-1編碼。步驟為:先把“李”字轉化為unicode,得到“674e”,再把“674e”轉化為iso8859-1字符。當然,這個映射不會成功,因為iso8859-1中根本就沒有與“674e”對應的字符。

  當映射不成功時,問題就發生了!當從某語言向unicode轉化時,如果在某語言中沒有該字符,得到的將是unicode的代碼“/uffffd”(“/u”表示是unicode編碼,)。而從unicode向某語言轉化時,如果某語言沒有對應的字符,則得到的是“0x3f”(“?”)。這就是“?”的由來。

  例如:把字符流buf =“0x80 0x40 0xb0 0xa1”進行new string(buf, "gb2312")操作,得到的結果是“/ufffd/u554a”,再println出來,得到的結果將是“?啊”,因為“0x80 0x40”是gbk中的字符,在gb2312中沒有。

  再如,把字符串string="/u00d6/u00ec/u00e9/u0046/u00bb/u00f9"進行new string (buf.getbytes("gbk"))操作,得到的結果是“3fa8aca8a6463fa8b4”,其中,“/u00d6”在“gbk”中沒有對應的字符,得到“3f”,“/u00ec”對應著“a8ac”,“/u00e9”對應著“a8a6”,“0046”對應著“46”(因為這是ascii字符),“/u00bb”沒找到,得到“3f”,最后,“/u00f9”對應著“a8b4”。把這個字符串println一下,得到的結果是“?ìéf?ù”??吹經]?這里并不全是問號,因為gbk與unicode映射的內容中除了漢字外還有字符,本例就是最好的明證。

  所以,在漢字轉碼時,如果發生錯亂,得到的不一定都是問號噢!不過,錯了終究是錯了,50步和100步并沒有質的差別。

  或者會問:如果源字符集中有,而unicode中沒有,結果會如何?回答是不知道。因為我手頭沒有能做這個測試的源字符集。但有一點是肯定的,那就是源字符集不夠規范。在java中,如果發生這種情況,是會拋出異常的。

  什么是utf

  utf,是unicode text format的縮寫,意為unicode文本格式。對于utf,是這樣定義的:

 ?。?)如果unicode的16位字符的頭9位是0,則用一個字節表示,這個字節的首位是“0”,剩下的7位與原字符中的后7位相同,如“/u0034”(0000 0000 0011 0100),用“34” (0011 0100)表示;(與源unicode字符是相同的);

 ?。?)如果unicode的16位字符的頭5位是0,則用2個字節表示,首字節是“110”開頭,后面的5位與源字符中除去頭5個零后的最高5位相同;第二個字節以“10”開頭,后面的6位與源字符中的低6位相同。如“/u025d”(0000 0010 0101 1101),轉化后為“c99d”(1100 1001 1001 1101);

 ?。?)如果不符合上述兩個規則,則用三個字節表示。第一個字節以“1110”開頭,后四位為源字符的高四位;第二個字節以“10”開頭,后六位為源字符中間的六位;第三個字節以“10”開頭,后六位為源字符的低六位;如“/u9da7”(1001 1101 1010 0111),轉化為“e9b6a7”(1110 1001 1011 0110 1010 0111);

  可以這么描述java程序中unicode與utf的關系,雖然不絕對:字符串在內存中運行時,表現為unicode代碼,而當要保存到文件或其它介質中去時,用的是utf。這個轉化過程是由writeutf和readutf來完成的。

  好了,基礎性的論述差不多了,下面進入正題。

  先把這個問題想成是一個黑匣子。先看黑匣子的一級表示:

input(charseta)->process(unicode)->output(charsetb)

  簡單,這就是一個ipo模型,即輸入、處理和輸出。同樣的內容要經過“從charseta到unicode再到charsetb”的轉化。

  再看二級表示:

sourcefile(jsp,java)->class->output

  在這個圖中,可以看出,輸入的是jsp和java源文件,在處理過程中,以class文件為載體,然后輸出。再細化到三級表示:

jsp->temp file->class->browser,os console,db

app,servlet->class->browser,os console,db

  這個圖就更明白了。jsp文件先生成中間的java文件,再生成class。而servlet和普通app則直接編譯生成class。然后,從class再輸出到瀏覽器、控制臺或數據庫等。

  jsp:從源文件到class的過程

  jsp的源文件是以“.jsp”結尾的文本文件。在本節中,將闡述jsp文件的解釋和編譯過程,并跟蹤其中的中文變化。

  1、jsp/servlet引擎提供的jsp轉換工具(jspc)搜索jsp文件中用<%@ page contenttype ="text/html; charset=<jsp-charset>"%>中指定的charset。如果在jsp文件中未指定<jsp-charset>,則取jvm中的默認設置file.encoding,一般情況下,這個值是iso8859-1;

  2、jspc用相當于“javac –encoding <jsp-charset>”的命令解釋jsp文件中出現的所有字符,包括中文字符和ascii字符,然后把這些字符轉換成unicode字符,再轉化成utf格式,存為java文件。ascii碼字符轉化為unicode字符時只是簡單地在前面加“00”,如“a”,轉化為“/u0041”(不需要理由,unicode的碼表就是這么編的)。然后,經過到utf的轉換,又變回“41”了!這也就是可以使用普通文本編輯器查看由jsp生成的java文件的原因;

  3、引擎用相當于“javac –encoding unicode”的命令,把java文件編譯成class文件;

  先看一下這些過程中中文字符的轉換情況。有如下源代碼:

<%@ page contenttype="text/html; charset=gb2312"%>
<html><body>
<%
 string a="中文";
 out.println(a);
%>
</body></html>

  這段代碼是在ultraedit for windows上編寫的。保存后,“中文”兩個字的16進制編碼為“d6 d0 ce c4”(gb2312編碼)。經查表,“中文”兩字的unicode編碼為“/u4e2d/u6587”,用 utf表示就是“e4 b8 ad e6 96 87”。打開引擎生成的由jsp文件轉變而成的java文件,發現其中的“中文”兩個字確實被“e4 b8 ad e6 96 87”替代了,再查看由java文件編譯生成的class文件,發現結果與java文件中的完全一樣。

  再看jsp中指定的charset為iso-8859-1的情況。

<%@ page contenttype="text/html; charset=iso-8859-1"%>
<html><body>
<%
 string a="中文";
 out.println(a);
%>
</body></html>

  同樣,該文件是用ultraedit編寫的,“中文”這兩個字也是存為gb2312編碼“d6 d0 ce c4”。先模擬一下生成的java文件和class文件的過程:jspc用iso-8859-1來解釋“中文”,并把它映射到unicode。由于iso-8859-1是8位的,且是拉丁語系,其映射規則就是在每個字節前加“00”,所以,映射后的unicode編碼應為“/u00d6/u00d0/u00ce/u00c4”,轉化成utf后應該是“c3 96 c3 90 c3 8e c3 84”。好,打開文件看一下,java文件和class文件中,“中文”果然都表示為“c3 96 c3 90 c3 8e c3 84”。

  如果上述代碼中不指定<jsp-charset>,即把第一行寫成“<%@ page contenttype="text/html" %>”,jspc會使用file.encoding的設置來解釋jsp文件。在redhat 6.2上,其處理結果與指定為iso-8859-1是完全相同的。

  到現在為止,已經解釋了從jsp文件到class文件的轉變過程中中文字符的映射過程。一句話:從“jspcharset到unicode再到utf”。下表總結了這個過程:

  表2 “中文”從jsp到class的轉化過程

jsp-charsetjsp文件中java文件中class文件中
gb2312d6 d0 ce c4(gb2312)從/u4e2d/u6587(unicode)到e4 b8 ad e6 96 87 (utf)e4 b8 ad e6 96 87 (utf)
iso-8859-1d6 d0 ce c4
(gb2312)
從/u00d6/u00d0/u00ce/u00c4 (unicode)到c3 96 c3 90 c3 8e c3 84 (utf)c3 96 c3 90 c3 8e c3 84 (utf)
無(默認=file.encoding)同iso-8859-1同iso-8859-1同iso-8859-1

  下節先討論servlet從java文件到class文件的轉化過程,然后再解釋從class文件如何輸出到客戶端。之所以這樣安排,是因為jsp和servlet在輸出時處理方法是一樣的。

 servlet:從源文件到class的過程

  servlet源文件是以“.java”結尾的文本文件。本節將討論servlet的編譯過程并跟蹤其中的中文變化。

  用“javac”編譯servlet源文件。javac可以帶“-encoding <compile-charset>”參數,意思是“用< 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("<html>");
  out.println("#中文#");
  out.println("</html>");
 }
}

  該文件也是用ultraedit for windows編寫的,其中的“中文”兩個字保存為“d6 d0 ce c4”(gb2312編碼)。

  開始編譯。下表是<compile-charset>不同時,class文件中“中文”兩字的十六進制碼。在編譯過程中,<servlet-charset>不起任何作用。<servlet-charset>只對class文件的輸出產生影響,實際上是<servlet-charset>和<compile-charset>一起,達到與jsp文件中的<jsp-charset>相同的效果,因為<jsp-charset>對編譯和class文件的輸出都會產生影響。

  表3 “中文”從servlet源文件到class的轉變過程

compile-charsetservlet源文件中class文件中等效的unicode碼
gb2312d6 d0 ce c4
(gb2312)
e4 b8 ad e6 96 87 (utf)/u4e2d/u6587 (在unicode中=“中文”)
iso-8859-1d6 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又是怎樣輸出中文的呢?

  class:輸出字符串

  上文說過,字符串在內存中表現為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的字符串按照某一種內碼重新生成字節流,然后把字節流輸入,相當于進行了一步“string.getbytes(???)”操作。???代表某一種字符集。

  如果是servlet,那么,這種內碼就是在httpservletresponse.setcontenttype()方法中指定的內碼,也就是上文定義的<servlet-charset>。

  如果是jsp,那么,這種內碼就是在<%@ page contenttype=""%>中指定的內碼,也就是上文定義的<jsp-charset>。

  如果是java程序,那么,這種內碼就是file.encoding中指定的內碼,默認為iso8859-1。

  當輸出對象是瀏覽器時

  以流行的瀏覽器ie為例。ie支持多種內碼。假如ie接收到了一個字節流“d6 d0 ce c4”,你可以嘗試用各種內碼去查看。你會發現用“簡體中文”時能得到正確的結果。因為“d6 d0 ce c4”本來就是簡體中文中“中文”兩個字的編碼。

  ok,完整地看一遍。

  jsp:源文件為gb2312格式的文本文件,且jsp源文件中有“中文”這兩個漢字

  如果指定了<jsp-charset>為gb2312,轉化過程如下表。

  表4 jsp-charset = gb2312時的變化過程

序號步驟說明結果
1編寫jsp源文件,且存為gb2312格式d6 d0 ce c4
(d6d0=中 cec4=文)
2jspc把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根據jsp-charset=gb2312把unicode轉化為字節流d6 d0 ce c4
6把字節流輸出到ie中,并設置ie的編碼為gb2312(作者按:這個信息隱藏在http頭中)d6 d0 ce c4
7ie用“簡體中文”查看結果“中文”(正確顯示)

  如果指定了<jsp-charset>為iso8859-1,轉化過程如下表。

  表5 jsp-charset = iso8859-1時的變化過程

序號步驟說明結果
1編寫jsp源文件,且存為gb2312格式d6 d0 ce c4
(d6d0=中 cec4=文)
2jspc把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
(啥都不是!?。。?/td>
5根據jsp-charset=iso8859-1把unicode轉化為字節流d6 d0 ce c4
6把字節流輸出到ie中,并設置ie的編碼為iso8859-1(作者按:這個信息隱藏在http頭中)d6 d0 ce c4
7ie用“西歐字符”查看結果亂碼,其實是四個ascii字符,但由于大于128,所以顯示出來的怪模怪樣
8改變ie的頁面編碼為“簡體中文”“中文”(正確顯示)

  奇怪了!為什么把<jsp-charset>設成gb2312和iso8859-1是一個樣的,都能正確顯示?因為表4表5中的第2步和第5步互逆,是相互“抵消”的。只不過當指定為iso8859-1時,要增加第8步操作,殊為不便。

  再看看不指定<jsp-charset> 時的情況。

  表6 未指定jsp-charset 時的變化過程

序號步驟說明結果
1編寫jsp源文件,且存為gb2312格式d6 d0 ce c4
(d6d0=中 cec4=文)
2jspc把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根據jsp-charset=iso8859-1把unicode轉化為字節流d6 d0 ce c4
6把字節流輸出到ie中d6 d0 ce c4
7ie用發出請求時的頁面的編碼查看結果視情況而定。如果是簡體中文,則能正確顯示,否則,需執行表5中的第8步

  servlet:源文件為java文件,格式是gb2312,源文件中含有“中文”這兩個漢字

  如果<compile-charset>=gb2312,<servlet-charset>=gb2312

  表7 compile-charset=servlet-charset=gb2312 時的變化過程

序號步驟說明結果
1編寫servlet源文件,且存為gb2312格式d6 d0 ce c4
(d6d0=中 cec4=文)
2用javac –encoding gb2312把java源文件編譯成class文件e4 b8 ad e6 96 87 (utf)
3運行時,先從class文件中用readutf讀出字符串,在內存中的是unicode編碼4e 2d 65 87 (unicode)
4根據servlet-charset=gb2312把unicode轉化為字節流d6 d0 ce c4 (gb2312)
5把字節流輸出到ie中并設置ie的編碼屬性為servlet-charset=gb2312d6 d0 ce c4 (gb2312)
6ie用“簡體中文”查看結果“中文”(正確顯示)

  如果<compile-charset>=iso8859-1,<servlet-charset>=iso8859-1

  表8 compile-charset=servlet-charset=iso8859-1時的變化過程

序號步驟說明結果
1編寫servlet源文件,且存為gb2312格式d6 d0 ce c4
(d6d0=中 cec4=文)
2用javac –encoding iso8859-1把java源文件編譯成class文件c3 96 c3 90 c3 8e c3 84?。╱tf)
3運行時,先從class文件中用readutf讀出字符串,在內存中的是unicode編碼00 d6 00 d0 00 ce 00 c4
4根據servlet-charset=iso8859-1把unicode轉化為字節流d6 d0 ce c4
5把字節流輸出到ie中并設置ie的編碼屬性為servlet-charset=iso8859-1d6 d0 ce c4 (gb2312)
6ie用“西歐字符”查看結果亂碼(原因同表5)
7改變ie的頁面編碼為“簡體中文”“中文”(正確顯示)

  如果不指定compile-charset或servlet-charset,其默認值均為iso8859-1。

  當compile-charset=servlet-charset時,第2步和第4步能互逆,“抵消”,顯示結果均能正確。讀者可試著寫一下compile-charset<>servlet-charset時的情況,肯定是不正確的。

  當輸出對象是數據庫時

  輸出到數據庫時,原理與輸出到瀏覽器也是一樣的。本節只是servlet為例,jsp的情況請讀者自行推導。

  假設有一個servlet,它能接收來自客戶端(ie,簡體中文)的漢字字符串,然后把它寫入到內碼為iso8859-1的數據庫中,然后再從數據庫中取出這個字符串,顯示到客戶端。

  表9 輸出對象是數據庫時的變化過程(1)

序號步驟說明結果
1在ie中輸入“中文”d6 d0 ce c4ie
2ie把字符串轉變成utf,并送入傳輸流中e4 b8 ad e6 96 87
3servlet接收到輸入流,用readutf讀取4e 2d 65 87(unicode)servlet
4編程者在servlet中必須把字符串根據gb2312還原為字節流d6 d0 ce c4
5編程者根據數據庫內碼iso8859-1生成新的字符串00 d6 00 d0 00 ce 00 c4
6把新生成的字符串提交給jdbc00 d6 00 d0 00 ce 00 c4
7jdbc檢測到數據庫內碼為iso8859-100 d6 00 d0 00 ce 00 c4jdbc
8jdbc把接收到的字符串按照iso8859-1生成字節流d6 d0 ce c4
9jdbc把字節流寫入數據庫中d6 d0 ce c4
10完成數據存儲工作d6 d0 ce c4 數據庫
以下是從數據庫中取出數的過程
11jdbc從數據庫中取出字節流d6 d0 ce c4jdbc
12jdbc按照數據庫的字符集iso8859-1生成字符串,并提交給servlet00 d6 00 d0 00 ce 00 c4 (unicode) 
13servlet獲得字符串00 d6 00 d0 00 ce 00 c4 (unicode)servlet
14編程者必須根據數據庫的內碼iso8859-1還原成原始字節流d6 d0 ce c4 
15編程者必須根據客戶端字符集gb2312生成新的字符串4e 2d 65 87
(unicode)
 
servlet準備把字符串輸出到客戶端
16servlet根據<servlet-charset>生成字節流d6d0 ce c4servlet
17servlet把字節流輸出到ie中,如果已指定<servlet-charset>,還會設置ie的編碼為<servlet-charset>d6 d0 ce c4
18ie根據指定的編碼或默認編碼查看結果“中文”(正確顯示)ie

  解釋一下,表中第4第5步和第15第16步是用紅色標記的,表示要由編碼者來作轉換。第4、5兩步其實就是一句話:“new string(source.getbytes("gb2312"), "iso8859-1")”。第15、16兩步也是一句話:“new string(source.getbytes("iso8859-1"), "gb2312")”。親愛的讀者,你在這樣編寫代碼時是否意識到了其中的每一個細節呢?

  至于客戶端內碼和數據庫內碼為其它值時的流程,和輸出對象是系統控制臺時的流程,請讀者自己想吧。明白了上述流程的原理,相信你可以輕松地寫出來。

  行文至此,已可告一段落了。終點又回到了起點,對于編程者而言,幾乎是什么影響都沒有。

  因為我們早就被告之要這么做了。

  以下給出一個結論,作為結尾。

  1、 在jsp文件中,要指定contenttype,其中,charset的值要與客戶端瀏覽器所用的字符集一樣;對于其中的字符串常量,不需做任何內碼轉換;對于字符串變量,要求能根據contenttype中指定的字符集還原成客戶端能識別的字節流,簡單地說,就是“字符串變量是基于<jsp-charset>字符集的”;

  2、 在servlet中,必須用httpservletresponse.setcontenttype()設置charset,且設置成與客戶端內碼一致;對于其中的字符串常量,需要在javac編譯時指定encoding,這個encoding必須與編寫源文件的平臺的字符集一樣,一般說來都是gb2312或gbk;對于字符串變量,與jsp一樣,必須“是基于<servlet-charset>字符集的”。

最大的網站源碼資源下載站,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影在线观看| 欧美视频一二三| 欧美午夜久久久| 欧美日韩亚洲视频一区| 欧美日韩久久久久| 成人欧美一区二区三区黑人| 亚洲欧美另类自拍| 韩国一区二区电影| 91日本在线视频| 日韩在线视频免费观看| 欧美日韩美女在线| 国内久久久精品| 亚洲欧洲在线播放| 亚洲精品影视在线观看| 日韩毛片在线看| 日韩av123| 国产精品主播视频| 5566成人精品视频免费| 欧美视频在线免费看| 国产亚洲精品高潮| 97精品一区二区视频在线观看| 亚洲xxxx18| 欧美乱大交xxxxx| 26uuu另类亚洲欧美日本一| 亚洲最大福利视频网站| 狠狠综合久久av一区二区小说| 黑人巨大精品欧美一区二区免费| 久久综合久久美利坚合众国| 国产一区二区三区在线视频| 日韩视频中文字幕| 欧美精品videossex88| 日韩av影片在线观看| 国产日韩在线精品av| 一区二区欧美激情| 国产精品香蕉国产| 热久久99这里有精品| 国产成人a亚洲精品| 亚洲国产毛片完整版| 日韩av成人在线观看| 久久色精品视频| 久久国产天堂福利天堂| 国产xxx69麻豆国语对白| 最新69国产成人精品视频免费| 国产精品私拍pans大尺度在线| 久久免费精品日本久久中文字幕| 91tv亚洲精品香蕉国产一区7ujn| 久久精品最新地址| 日韩在线播放一区| 国产欧美精品一区二区三区-老狼| 亚洲视频在线观看| 亚洲欧美三级在线| 91久久精品视频| 欧美成人在线免费| 亚洲第一区在线| 中文字幕亚洲综合久久筱田步美| 久久久999精品免费| 国产欧美精品一区二区| 国产欧美一区二区| 色婷婷综合久久久久中文字幕1| 欧美日韩在线第一页| 午夜精品蜜臀一区二区三区免费| 欧美一区二区三区……| 国产亚洲aⅴaaaaaa毛片| 中文字幕亚洲一区二区三区| 韩国三级电影久久久久久| 成人h猎奇视频网站| 国产成人在线播放| 欧美性受xxxx黑人猛交| 97av在线播放| 欧美成人午夜剧场免费观看| 亚洲人成77777在线观看网| 136fldh精品导航福利| 日韩精品视频在线观看免费| 日韩中文字幕不卡视频| 亚洲欧美激情精品一区二区| 国产成人精品午夜| 尤物yw午夜国产精品视频明星| 欧美精品激情blacked18| 欧美日韩中文字幕在线视频| 欧美精品在线视频观看| 亚洲石原莉奈一区二区在线观看| 91在线观看免费高清完整版在线观看| 久久久爽爽爽美女图片| 欧美一级视频免费在线观看| 91久久精品久久国产性色也91| 欧美性猛交xxxx富婆| 国产精品黄页免费高清在线观看| 国产精品视频1区| 国产精品久久久久久搜索| 亚洲国产精品99久久| 亚洲精品wwwww| 中文字幕亚洲欧美日韩高清| 美日韩精品免费观看视频| 欧美日韩中文字幕综合视频| 久久久久久噜噜噜久久久精品| 欧美综合激情网| 热re91久久精品国99热蜜臀| 亚洲成人三级在线| 奇门遁甲1982国语版免费观看高清| 亚洲人成在线免费观看| 国产99在线|中文| 另类专区欧美制服同性| 日本精品久久中文字幕佐佐木| 日韩欧美成人网| 久久手机免费视频| 国产精品久久久久久超碰| 日韩中文理论片| 在线观看91久久久久久| 亚洲国产精久久久久久久| 久久久久久久av| 日韩美女在线看| 51视频国产精品一区二区| 欧美华人在线视频| 久久亚洲影音av资源网| 日本午夜在线亚洲.国产| 国产精品专区一| 亚洲精品美女免费| www.日韩视频| 亚洲风情亚aⅴ在线发布| 97超视频免费观看| 日本中文字幕久久看| 国产激情视频一区| 欧美在线国产精品| 欧美日韩国产页| 久久久久久久97| 国产精品福利网站| 日韩电影免费在线观看中文字幕| 亚洲性xxxx| 国产欧美婷婷中文| 国产精品白嫩美女在线观看| 欧美精品精品精品精品免费| 久久99国产精品久久久久久久久| 97成人超碰免| 亚洲已满18点击进入在线看片| 97精品在线观看| 日韩影视在线观看| 欧美电影《睫毛膏》| 亚洲人永久免费| 欧美成人一二三| 欧美综合激情网| www.日本久久久久com.| 久久伊人色综合| 综合久久五月天| 91在线免费看网站| 欲色天天网综合久久| 成人av电影天堂| 精品日本美女福利在线观看| 久久999免费视频| 欧美一区三区三区高中清蜜桃| 欧美极品美女视频网站在线观看免费| 超碰97人人做人人爱少妇| 亚洲精品99久久久久中文字幕| 欧美一区二区影院| 国产午夜精品视频| 亚洲自拍中文字幕| 欧美日韩人人澡狠狠躁视频| 欧美激情啊啊啊| 91精品久久久久久久久久入口| www日韩欧美| 国产综合久久久久久| 97福利一区二区| 亚洲天堂av图片| 久久这里有精品| 日韩视频永久免费观看|