国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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,是這樣定義的:

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

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

  (3)如果不符合上述兩個規則,則用三個字節表示。第一個字節以“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
(啥都不是!!!)
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 (utf)
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>字符集的”。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东方市| 兴城市| 东莞市| 瑞丽市| 高清| 景谷| 泰和县| 杂多县| 抚州市| 榕江县| 长兴县| 通渭县| 鸡西市| 浏阳市| 香格里拉县| 大石桥市| 文安县| 大同县| 潞西市| 周宁县| 江陵县| 于田县| 宜兴市| 和平县| 资阳市| 曲水县| 布尔津县| 汉中市| 察哈| 印江| 门源| 榕江县| 临澧县| 西充县| 犍为县| 星子县| 宝丰县| 礼泉县| 云阳县| 海晏县| 灵丘县|