本文深入剖析JSP charset,包括Unicode有一个特性:它包括了世界上所有的字符字形,以及介绍什么是UTF。

国际上的各区域都有本地的言语。区域差异直接导致了言语环境的差异。在开发一个国际化程序的进程中,处理言语问题就显得很重要了。

深化分析JSP charset(深化分析研判)  JSP charset 第1张

这是一个国际规模内都存在的问题,所以,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中,与中文相关的编码有:
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。

举例阐明。有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文件;

先看一下这些进程中中文字符的转化状况。有如下源代码:

  1. <%@pagecontentType="text/html;charset=gb2312"%>
  2. <html><body>
  3. <%
  4. Stringa="中文";
  5. out.println(a);
  6. %>
  7. </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的状况。

  1. <%@pagecontentType="text/html;charset=ISO-8859-1"%>
  2. <html><body>
  3. <%
  4. Stringa="中文";
  5. out.println(a);
  6. %>
  7. </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”。下表总结了这个进程:

“中文”从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有关。

看下例:

  1. importjavax.servlet.*;
  2. importjavax.servlet.http.*;
  3. classtestServletextendsHttpServlet
  4. {
  5. publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
  6. throwsServletException,java.io.IOException
  7. {
  8. resp.setContentType("text/html;charset=GB2312");
  9. java.io.PrintWriterout=resp.getWriter();
  10. out.println("<html>");
  11. out.println("#中文#");
  12. out.println("</html>");
  13. }
  14. }

该文件也是用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文件的输出都会产生影响。

“中文”从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来进行映射,得到的成果很或许是一大堆乱码,由于在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。

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。

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是一个样的,都能正确显现?只不过当指定为ISO8859-1时,要添加第8步操作,殊为不方便。

再看看不指定<JSP charset> 时的状况。

未指定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用宣布恳求时的页面的编码检查成果 视状况而定。

Servlet:源文件为JAVA文件,格局是GB2312,源文件中含有“中文”这两个汉字

假设<Compile-charset>=GB2312,<Servlet-charset>=GB2312

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

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用“西欧字符”检查成果 乱码
7 改动IE的页面编码为“简体中文” “中文”(正确显现)

假设不指定Compile-charset或Servlet-charset,其默许值均为ISO8859-1。

当Compile-charset=Servlet-charset时,第2步和第4步能互逆,“抵消”,显现成果均能正确。读者可试着写一下Compile-charset<>Servlet-charset时的状况,必定是不正确的。

当输出对象是数据库时

输出到数据库时,原理与输出到阅读器也是相同的。本节仅仅Servlet为例,JSP的状况请读者自行推导。

假设有一个Servlet,它能接纳来自客户端(IE,简体中文)的汉字字符串,然后把它写入到内码为ISO8859-1的数据库中,然后再从数据库中取出这个字符串,显现到客户端。

输出对象是数据库时的改动进程(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>字符集的”。

【修改引荐】

  1. 详解JSP中调用JavaBean
  2. JSP开发环境的建立
  3. 处理JSP开发Web程序中文显现三种办法
  4. 开发JSP HTTP服务器
  5. JSP、ASP和PHP安全编程
转载请说明出处
知优网 » 深化分析JSP charset(深化分析研判)

发表评论

您需要后才能发表评论