大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> 深入剖析JSP和Servlet对中文的处理

深入剖析JSP和Servlet对中文的处理

时间: 2021-07-31 作者:daque

  寰球上的各地域都有当地的谈话。地域分别径直引导了谈话情况的分别。在开拓一个国际化步调的进程中,处置谈话题目就显得很要害了。

  这是一个寰球范畴内都生存的题目,以是,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中与华文关系的源代码列表

源代码称呼

证明

ascii

7位,与ascii7沟通

iso8859-1

8-位,与 8859_1,iso-8859-1,iso_8859-1,latin1...等沟通

gb2312-80

16位,与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。

  举例证明。有gb231第22中学有一个中国字“李”,其源代码为“c0ee”,欲变化为iso8859-1源代码。办法为:先把“李”字变化为unicode,获得“674e”,再把“674e”变化为iso8859-1字符。固然,这个映照不会胜利,由于iso8859-第11中学基础就没有与“674e”对应的字符。

  当映照不可功时,题目就爆发了!当从某谈话向unicode变化时,即使在某谈话中没有该字符,获得的将是unicode的代码“\uffffd”(“\u”表白是unicode源代码,)。而从unicode向某谈话变化时,即使某谈话没有对应的字符,则获得的是“0x3f”(“?”)。这即是“?”的来由。

  比方:把字符流buf =“0x80 0x40 0xb0 0xa1”举行new string(buf, "gb2312")操纵,获得的截止是“\ufffd\u554a”,再println出来,获得的截止将是“?啊”,由于“0x80 0x40”是gbk中的字符,在gb231第22中学没有。

  再如,把字符串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=utf8"%><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-charset

jsp文献中

java文献中

class文献中

gb2312

d6 d0 ce c4(gb2312)

从\u4e2d\u6587(unicode)到e4 b8 ad e6 96 87 (utf)

e4 b8 ad e6 96 87 (utf)

iso-8859-1

d6 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-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又是还好吗输入华文的呢?  class:输入字符串  下文说过,字符串在外存中展现为unicode源代码。至于这种unicode源代码表白了什么,那要看它是从哪种字符集映照过来的,也即是说要看它的前辈。这比如在托运行装时,表面都是纸箱子,内里装了什么就要看寄邮件的人本质邮了什么货色。  看看上头的例子,即使给一串unicode源代码“00d6 00d0 00ce 00c4”,即使不作变换,径直用unicode码表来比较它时,是四个字符(并且是特出字符);假设把它与“iso8859-1”举行映照,则径直去掉前方的“00”即可获得“d6 d0 ce c4”,这是ascii码表中的四个字符;而假设把它看成gb2312来举行映照,获得的截止很大概是第一次全国代表大会堆乱码,由于在gb231第22中学有大概没有(也有大概有)字符与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=文)

2

jspc把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

7

ie用“简体华文”察看截止

“华文”(精确表露)

  即使指定了<jsp-charset>为iso8859-1,变化进程如次表。  表5 jsp-charset = iso8859-1时的变革进程

序号

办法证明

截止

1

编写jsp源文献,且存为gb2312方法

d6 d0 ce c4(d6d0=中 cec4=文)

2

jspc把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

7

ie用“西欧字符”察看截止

乱码,本来是四个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=文)

2

jspc把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

7

ie用发出乞求时的页面包车型的士源代码察看截止

视情景而定。即使是简体华文,则能精确表露,要不,需实行表第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=gb2312

d6 d0 ce c4 (gb2312)

6

ie用“简体华文”察看截止

“华文”(精确表露)

  即使<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-1

d6 d0 ce c4 (gb2312)

6

ie用“西欧字符”察看截止

乱码(因为同表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 c4

ie

2

ie把字符串变化成utf,并送入传输流中

e4 b8 ad e6 96 87

3

servlet接受到输出流,用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

把新天生的字符串提交给jdbc

00 d6 00 d0 00 ce 00 c4

7

jdbc检验和测定到数据库内码为iso8859-1

00 d6 00 d0 00 ce 00 c4

jdbc

8

jdbc把接受到的字符串依照iso8859-1天生字俭朴

d6 d0 ce c4

9

jdbc把字俭朴写入数据库中

d6 d0 ce c4

10

实行数据保存处事

d6 d0 ce c4 数据库

以次是从数据库中掏出数的进程

11

jdbc从数据库中掏出字俭朴

d6 d0 ce c4

jdbc

12

jdbc依照数据库的字符集iso8859-1天生字符串,并提交给servlet

00 d6 00 d0 00 ce 00 c4 (unicode)

 

13

servlet赢得字符串

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筹备把字符串输入到存户端

16

servlet按照<servlet-charset>天生字俭朴

d6d0 ce c4

servlet

17

servlet把字俭朴输入到ie中,即使已指定<servlet-charset>,还会树立ie的源代码为<servlet-charset>

d6 d0 ce c4

18

ie按照指定的源代码或默许源代码察看截止

“华文”(精确表露)

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>字符集的”。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.