??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV成人精品日韩一区18p,2020天堂在线亚洲精品专区,国产美女亚洲精品久久久综合http://www.tkk7.com/Sayyid/archive/2006/05/27/48522.htmlSayyidSayyidSat, 27 May 2006 13:38:00 GMThttp://www.tkk7.com/Sayyid/archive/2006/05/27/48522.htmlhttp://www.tkk7.com/Sayyid/comments/48522.htmlhttp://www.tkk7.com/Sayyid/archive/2006/05/27/48522.html#Feedback0http://www.tkk7.com/Sayyid/comments/commentRss/48522.htmlhttp://www.tkk7.com/Sayyid/services/trackbacks/48522.html  前些日子写一论文,本来计划?天写完,l果用了7天完成。最q的毕业设计Q本来计?5号前完成Q结果照目前的进度看又得推迟两三天了。也不知道做开发的人员对自己工作的q度是怎么控制的,反正我想大多Ch是有托懒的习惯的Q所以说在Y件开发过E中q行严格的进度把x非常必要的。写一论文都会推q几天,那么一个大型项目把不好关的话也怼延期以月甚至qؓ单位?img src ="http://www.tkk7.com/Sayyid/aggbug/48522.html" width = "1" height = "1" />

Sayyid 2006-05-27 21:38 发表评论
]]>
深入剖析JSP和Servlet对中文的处理http://www.tkk7.com/Sayyid/archive/2006/05/22/47495.htmlSayyidSayyidMon, 22 May 2006 09:01:00 GMThttp://www.tkk7.com/Sayyid/archive/2006/05/22/47495.htmlhttp://www.tkk7.com/Sayyid/comments/47495.htmlhttp://www.tkk7.com/Sayyid/archive/2006/05/22/47495.html#Feedback0http://www.tkk7.com/Sayyid/comments/commentRss/47495.htmlhttp://www.tkk7.com/Sayyid/services/trackbacks/47495.html  

深入剖析JSP和Servlet对中文的处理
作者:未知  来源Q{?a >http://www.sucai.com/article/show.asp?id=8142

        世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化E序的过E中Q处理语a问题显得很重要了?

  q是一个世界范围内都存在的问题Q所以,Java提供了世界性的解决Ҏ。本文描q的Ҏ是用于处理中文的Q但是,推而广之,对于处理世界上其它国家和地区的语a同样适用?/p>

  汉字是双字节的。所谓双字节是指一个双字要占用两个BYTE的位|(?6位)Q分别称为高位和低位。中国规定的汉字~码为GB2312Q这是强制性的Q目前几乎所有的能处理中文的应用E序都支持GB2312。GB2312包括了一二汉字?区符P高位?xa1?xfeQ低位也是从0xa1?xfeQ其中,汉字的编码范围ؓ0xb0a1?xf7fe?/p>

  另外有一U编码,叫做GBKQ但q是一份规范,不是强制的。GBK提供?0902个汉字,它兼容GB2312Q编码范围ؓ0x8140?xfefe。GBK中的所有字W都可以一一映射到Unicode 2.0?/p>

  在不久的来Q中国会颁布另一U标准:GB18030-2000QGBK2KQ。它收录了藏、蒙{少数民族的字型Q从Ҏ上解决了字位不的问题。注意:它不再是定长的。其二字节部份与GBK兼容Q四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81?xfeQ二字节和第四字节从0x30?x39?/p>

  本文不打介lUnicodeQ有兴趣的可以浏览“http://www.unicode.org/”查看更多的信息。Unicode有一个特性:它包括了世界上所有的字符字Ş。所以,各个地区的语a都可以徏立与Unicode的映关p,而Java正是利用了这一点以辑ֈ异种语言之间的{换?/p>

  在JDK中,与中文相关的~码有:

  ? JDK中与中文相关的编码列?br />

~码名称说明
ASCII7位,与ascii7相同
ISO8859-18-位,?8859_1,ISO-8859-1,ISO_8859-1,latin1...{相?/td>
GB2312-8016位,与gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB...{相?/td>
GBK与MS936相同Q注意:区分大小?/td>
UTF8与UTF-8相同
GB18030与cp1392?392相同Q目前支持的JDK很少

  在实际编E时Q接触得比较多的是GB2312QGBKQ和ISO8859-1?/p>

  Z么会有?”号

  上文说过Q异U语a之间的{换是通过Unicode来完成的。假设有两种不同的语aA和BQ{换的步骤为:先把A转化为UnicodeQ再把Unicode转化为B?/p>

  举例说明。有GB2312中有一个汉字“李”,其编码ؓ“C0EE”,Ʋ{化ؓISO8859-1~码。步骤ؓQ先把“李”字转化为UnicodeQ得到?74E”,再把?74E”{化ؓISO8859-1字符。当Ӟq个映射不会成功Q因为ISO8859-1中根本就没有与?74E”对应的字符?/p>

  当映不成功Ӟ问题发生了Q当从某语言向Unicode转化Ӟ如果在某语言中没有该字符Q得到的是Unicode的代码“\uffffd”(“\u”表C是Unicode~码Q)。而从Unicode向某语言转化Ӟ如果某语a没有对应的字W,则得到的是?x3f”(?”)。这是?”的由来?/p>

  例如Q把字符buf =?x80 0x40 0xb0 0xa1”进行new String(buf, "gb2312")操作Q得到的l果是“\ufffd\u554a”,再println出来Q得到的l果是?啊”,因ؓ?x80 0x40”是GBK中的字符Q在GB2312中没有?/p>

  再如Q把字符串String="\u00d6\u00ec\u00e9\u0046\u00bb\u00f9"q行new String (buf.getBytes("GBK"))操作Q得到的l果是?fa8aca8a6463fa8b4”,其中Q“\u00d6”在“GBK”中没有对应的字W,得到?f”,“\u00ec”对应着“a8ac”,“\u00e9”对应着“a8a6”,?046”对应着?6”(因ؓq是ASCII字符Q,“\u00bb”没扑ֈQ得到?f”,最后,“\u00f9”对应着“a8b4”。把q个字符串println一下,得到的结果是?ìéF?ù”。看到没Q这里ƈ不全是问P因ؓGBK与Unicode映射的内容中除了汉字外还有字W,本例是最好的明证?/p>

  所以,在汉字{码时Q如果发生错乱,得到的不一定都是问号噢Q不q,错了l究是错了,50步和100步ƈ没有质的差别?/p>

  或者会问:如果源字W集中有Q而Unicode中没有,l果会如何?回答是不知道。因为我手头没有能做q个试的源字符集。但有一Ҏ肯定的,那就是源字符集不够规范。在Java中,如果发生q种情况Q是会抛出异常的?br />
  什么是UTF

  UTFQ是Unicode Text Format的羃写,意ؓUnicode文本格式。对于UTFQ是q样定义的:

  Q?Q如果Unicode?6位字W的?位是0Q则用一个字节表C,q个字节的首位是?”,剩下?位与原字W中的后7位相同,如“\u0034”(0000 0000 0011 0100Q,用?4?(0011 0100)表示Q(与源Unicode字符是相同的Q;

  Q?Q如果Unicode?6位字W的?位是0Q则?个字节表C,首字节是?10”开_后面?位与源字W中除去?个零后的最?位相同;W二个字节以?0”开_后面?位与源字W中的低6位相同。如“\u025d”(0000 0010 0101 1101Q,转化后ؓ“c99d”(1100 1001 1001 1101Q;

  Q?Q如果不W合上述两个规则Q则用三个字节表C。第一个字节以?110”开_后四位ؓ源字W的高四位;W二个字节以?0”开_后六位ؓ源字W中间的六位Q第三个字节以?0”开_后六位ؓ源字W的低六位;如“\u9da7”(1001 1101 1010 0111Q,转化为“e9b6a7”(1110 1001 1011 0110 1010 0111Q;

  可以q么描述JAVAE序中Unicode与UTF的关p,虽然不绝对:字符串在内存中运行时Q表CؓUnicode代码Q而当要保存到文g或其它介质中LQ用的是UTF。这个{化过E是由writeUTF和readUTF来完成的?/p>

  好了Q基性的差不多了Q下面进入正题?/p>

  先把q个问题x是一个黑匣子。先看黑匣子的一U表C:

input(charsetA)->process(Unicode)->output(charsetB)

  单,q就是一个IPO模型Q即输入、处理和输出。同L内容要经q“从charsetA到unicode再到charsetB”的转化?/p>

  再看二表示Q?/p>

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

  在这个图中,可以看出Q输入的是jsp和java源文Ӟ在处理过E中Q以Class文g体,然后输出。再l化CU表C:

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

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

  q个囑ְ更明白了。Jsp文g先生成中间的Java文gQ再生成Class。而Servlet和普通App则直接编译生成Class。然后,从Class再输出到览器、控制台或数据库{?/p>

  JSPQ从源文件到Class的过E?/p>

  Jsp的源文g是以?jsp”结文本文g。在本节中,阐qJSP文g的解释和~译q程Qƈ跟踪其中的中文变化?/p>

  1、JSP/Servlet引擎提供的JSP转换工具QjspcQ搜索JSP文g中用<%@ page contentType ="text/html; charset=<Jsp-charset>"%>中指定的charset。如果在JSP文g中未指定<Jsp-charset>Q则取JVM中的默认讄file.encodingQ一般情况下Q这个值是ISO8859-1Q?/p>

  2、jspc用相当于“javac –encoding <Jsp-charset>”的命o解释JSP文g中出现的所有字W,包括中文字符和ASCII字符Q然后把q些字符转换成Unicode字符Q再转化成UTF格式Q存为JAVA文g。ASCII码字W{化ؓUnicode字符时只是简单地在前面加?0”,如“A”,转化为“\u0041”(不需要理由,Unicode的码表就是这么编的)。然后,l过到UTF的{换,又变回?1”了Q这也就是可以用普通文本编辑器查看由JSP生成的JAVA文g的原因;

  3、引擎用相当于“javac –encoding UNICODE”的命oQ把JAVA文g~译成CLASS文gQ?/p>

  先看一下这些过E中中文字符的{换情c有如下源代码:

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

  q段代码是在UltraEdit for Windows上编写的。保存后Q“中文”两个字?6q制~码为“D6 D0 CE C4”(GB2312~码Q。经查表Q“中文”两字的Unicode~码为“\u4E2D\u6587”,?UTF表示是“E4 B8 AD E6 96 87”。打开引擎生成的由JSP文g转变而成的JAVA文gQ发现其中的“中文”两个字实被“E4 B8 AD E6 96 87”替代了Q再查看由JAVA文g~译生成的CLASS文gQ发现结果与JAVA文g中的完全一栗?/p>

  再看JSP中指定的CharSet为ISO-8859-1的情c?/p>

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

  同样Q该文g是用UltraEdit~写的,“中文”这两个字也是存为GB2312~码“D6 D0 CE C4”。先模拟一下生成的JAVA文g和CLASS文g的过E:jspc用ISO-8859-1来解释“中文”,q把它映到Unicode。由于ISO-8859-1?位的Q且是拉丁语p,其映规则就是在每个字节前加?0”,所以,映射后的Unicode~码应ؓ“\u00D6\u00D0\u00CE\u00C4”,转化成UTF后应该是“C3 96 C3 90 C3 8E C3 84”。好Q打开文g看一下,JAVA文g和CLASS文g中,“中文”果焉表示为“C3 96 C3 90 C3 8E C3 84”?/p>

  如果上述代码中不指定<Jsp-charset>Q即把第一行写成?lt;%@ page contentType="text/html" %>”,JSPC会用file.encoding的设|来解释JSP文g。在RedHat 6.2上,其处理结果与指定为ISO-8859-1是完全相同的?/p>

  到现在ؓ止,已经解释了从JSP文g到CLASS文g的{变过E中中文字符的映过E。一句话Q从“JspCharSet到Unicode再到UTF”。下表ȝ了这个过E:

  ? “中文”从JSP到CLASS的{化过E?br />

Jsp-CharSetJSP文g?/td>JAVA文g?/td>CLASS文g?/td>
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)
无(默认Qfile.encodingQ?/td>同ISO-8859-1同ISO-8859-1同ISO-8859-1

  下节先讨论Servlet从JAVA文g到CLASS文g的{化过E,然后再解释从CLASS文g如何输出到客L。之所以这样安排,是因为JSP和Servlet在输出时处理Ҏ是一L?

  ServletQ从源文件到Class的过E?/p>

  Servlet源文件是以?java”结文本文g。本节将讨论Servlet的编译过Eƈ跟踪其中的中文变化?/p>

  用“javac”编译Servlet源文件。javac可以带?encoding <Compile-charset>”参敎ͼ意思是“用< Compile-charset >中指定的~码来解释Serlvet源文件”?/p>

  源文件在~译Ӟ?lt;Compile-charset>来解释所有字W,包括中文字符和ASCII字符。然后把字符帔R转变成Unicode字符Q最后,把Unicode转变成UTF?/p>

  在Servlet中,q有一个地方设|输出流的CharSet。通常在输出结果前Q调用HttpServletResponse的setContentTypeҎ来达C在JSP中设|?lt;Jsp-charset>一L效果Q称之ؓ<Servlet-charset>?/p>

  注意Q文中一共提C三个变量Q?lt;Jsp-charset>?lt;Compile-charset>?lt;Servlet-charset>。其中,JSP文g只与<Jsp-charset>有关Q?lt;Compile-charset>?lt;Servlet-charset>只与Servlet有关?/p>

  看下例:

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~码Q?/p>

  开始编译。下表是<Compile-charset>不同ӞCLASS文g中“中文”两字的十六q制码。在~译q程中,<Servlet-charset>不vM作用?lt;Servlet-charset>只对CLASS文g的输Z生媄响,实际上是<Servlet-charset>?lt;Compile-charset>一P辑ֈ与JSP文g中的<Jsp-charset>相同的效果,因ؓ<Jsp-charset>对编译和CLASS文g的输出都会生媄响?/p>

  ? “中文”从Servlet源文件到Class的{变过E?br />

Compile-charsetServlet源文件中Class文g?/td>{效的Unicode?/td>
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前面各加了一?0)
无(默认Q?/td>D6 D0 CE C4 (GB2312)同ISO-8859-1同ISO-8859-1

  普通JavaE序的编译过E与Servlet完全一栗?br />
  CLASS文g中的中文表示法是不是昭然若揭了?OKQ接下来看看CLASS又是怎样输出中文的呢Q?br />
  ClassQ输出字W串

  上文说过Q字W串在内存中表现为Unicode~码。至于这UUnicode~码表示了什么,那要看它是从哪种字符集映过来的Q也是说要看它的祖先。这好比在托q行李时Q外观都是纸子Q里面装了什么就要看寄邮件的人实际邮了什么东ѝ?br />
  看看上面的例子,如果l一串Unicode~码?0D6 00D0 00CE 00C4”,如果不作转换Q直接用Unicode码表来对照它Ӟ是四个字W(而且是特D字W)Q假如把它与“ISO8859-1”进行映,则直接去掉前面的?0”即可得到“D6 D0 CE C4”,q是ASCII码表中的四个字符Q而假如把它当作GB2312来进行映,得到的结果很可能是一大堆qQ因为在GB2312中有可能没有Q也有可能有Q字W与00D6{字W对应(如果对应不上Q将得到0x3fQ也是问号Q如果对应上了,׃00D6{字W太靠前Q估计也是一些特D符P真正的汉字在Unicode中的~码?E00开始)?br />
  各位看到了,同样的Unicode字符Q可以解释成不同的样子。当Ӟq其中有一U是我们期望的结果。以上例而论Q“D6 D0 CE C4”应该是我们所惌的,当把“D6 D0 CE C4”输出到IE中时Q用“简体中文”方式查看,p看到清楚的“中文”两个字了。(当然了,如果你一定要用“西Ƨ字W”来看,那也没办法,你将得不CQ何有何时何地的东西)Z么呢Q因为?0D6 00D0 00CE 00C4”本来就是由ISO8859-1转化q去的?br />  l出如下l论Q?br />
  在Class输出字符串前Q会Unicode的字W串按照某一U内码重新生成字节流Q然后把字节输入,相当于进行了一步“String.getBytes(???)”操作???代表某一U字W集?br />
  如果是ServletQ那么,q种内码是在HttpServletResponse.setContentType()Ҏ中指定的内码Q也是上文定义的<Servlet-charsetQ?br />
  如果是JSPQ那么,q种内码是在<%@ page contentType=""%Q中指定的内码,也就是上文定义的QJsp-charsetQ?br />
  如果是JavaE序Q那么,q种内码是file.encoding中指定的内码Q默认ؓISO8859-1?br />
  当输出对象是览器时

  以流行的览器IEZ。IE支持多种内码。假如IE接收C一个字节流“D6 D0 CE C4”,你可以尝试用各种内码L看。你会发现用“简体中文”时能得到正的l果。因为“D6 D0 CE C4”本来就是简体中文中“中文”两个字的编码?br />
  OKQ完整地看一遍?br />
  JSPQ源文g为GB2312格式的文本文Ӟ且JSP源文件中有“中文”这两个汉字

  如果指定了<Jsp-charsetQؓGB2312Q{化过E如下表?br />
  ? Jsp-charset = GB2312时的变化q程

序号步骤说明l果
1~写JSP源文Ӟ且存为GB2312格式D6 D0 CE C4
QD6D0=?CEC4=文)
2jspc把JSP源文件{化ؓ临时JAVA文gQƈ把字W串按照GB2312映射到UnicodeQƈ用UTF格式写入JAVA文g?/td>E4 B8 AD E6 96 87
3把时JAVA文g~译成CLASS文gE4 B8 AD E6 96 87
4q行Ӟ先从CLASS文g中用readUTFd字符Ԍ在内存中的是Unicode~码4E 2D 65 87Q在Unicode?E2D=?6587=文)
5ҎJsp-charset=GB2312把Unicode转化为字节流D6 D0 CE C4
6把字节流输出到IE中,q设|IE的编码ؓGB2312Q作者按Q这个信息隐藏在HTTP头中Q?/td>D6 D0 CE C4
7IE用“简体中文”查看结?/td>“中文”(正确昄Q?/td>

  如果指定了<Jsp-charsetQؓISO8859-1Q{化过E如下表?br />
  ? Jsp-charset = ISO8859-1时的变化q程

序号步骤说明l果
1~写JSP源文Ӟ且存为GB2312格式D6 D0 CE C4
QD6D0=?CEC4=文)
2jspc把JSP源文件{化ؓ临时JAVA文gQƈ把字W串按照ISO8859-1映射到UnicodeQƈ用UTF格式写入JAVA文g?/td>C3 96 C3 90 C3 8E C3 84
3把时JAVA文g~译成CLASS文gC3 96 C3 90 C3 8E C3 84
4q行Ӟ先从CLASS文g中用readUTFd字符Ԍ在内存中的是Unicode~码00 D6 00 D0 00 CE 00 C4
Q啥都不是!Q!Q?/td>
5ҎJsp-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
6把字节流输出到IE中,q设|IE的编码ؓISO8859-1Q作者按Q这个信息隐藏在HTTP头中Q?/td>D6 D0 CE C4
7IE用“西Ƨ字W”查看结?/td>qQ其实是四个ASCII字符Q但׃大于128Q所以显C出来的怪模怪样
8改变IE的页面编码ؓ“简体中文?/td>“中文”(正确昄Q?/td>

  奇怪了Qؓ什么把QJsp-charsetQ设成GB2312和ISO8859-1是一个样的,都能正确昄Q因4?中的W?步和W?步互逆,是相互“抵消”的。只不过当指定ؓISO8859-1Ӟ要增加第8步操作,Dؓ不便?br />
  再看看不指定QJsp-charsetQ?时的情况?br />
  ? 未指定Jsp-charset 时的变化q程

序号步骤说明l果
1~写JSP源文Ӟ且存为GB2312格式D6 D0 CE C4
QD6D0=?CEC4=文)
2jspc把JSP源文件{化ؓ临时JAVA文gQƈ把字W串按照ISO8859-1映射到UnicodeQƈ用UTF格式写入JAVA文g?/td>C3 96 C3 90 C3 8E C3 84
3把时JAVA文g~译成CLASS文gC3 96 C3 90 C3 8E C3 84
4q行Ӟ先从CLASS文g中用readUTFd字符Ԍ在内存中的是Unicode~码00 D6 00 D0 00 CE 00 C4
5ҎJsp-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
6把字节流输出到IE?/td>D6 D0 CE C4
7IE用发求时的页面的~码查看l果视情况而定。如果是体中文,则能正确昄Q否则,需执行?中的W??/td>

  ServletQ源文g为JAVA文gQ格式是GB2312Q源文g中含有“中文”这两个汉字

  如果QCompile-charsetQ=GB2312Q<Servlet-charsetQ?GB2312

  ? Compile-charset=Servlet-charset=GB2312 时的变化q程

序号步骤说明l果
1~写Servlet源文Ӟ且存为GB2312格式D6 D0 CE C4
QD6D0=?CEC4=文)
2用javac –encoding GB2312把JAVA源文件编译成CLASS文gE4 B8 AD E6 96 87 QUTFQ?/td>
3q行Ӟ先从CLASS文g中用readUTFd字符Ԍ在内存中的是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用“简体中文”查看结?/td>“中文”(正确昄Q?/td>

  如果QCompile-charsetQ=ISO8859-1Q<Servlet-charsetQ?ISO8859-1

  ? Compile-charset=Servlet-charset=ISO8859-1时的变化q程

序号步骤说明l果
1~写Servlet源文Ӟ且存为GB2312格式D6 D0 CE C4
QD6D0=?CEC4=文)
2用javac –encoding ISO8859-1把JAVA源文件编译成CLASS文gC3 96 C3 90 C3 8E C3 84 QUTFQ?/td>
3q行Ӟ先从CLASS文g中用readUTFd字符Ԍ在内存中的是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用“西Ƨ字W”查看结?/td>qQ原因同?Q?/td>
7改变IE的页面编码ؓ“简体中文?/td>“中文”(正确昄Q?/td>

  如果不指定Compile-charset或Servlet-charsetQ其默认值均为ISO8859-1?br />
  当Compile-charset=Servlet-charsetӞW?步和W?步能互逆,“抵消”,昄l果均能正确。读者可试着写一下Compile-charsetQ>Servlet-charset时的情况Q肯定是不正的?br />
  当输出对象是数据库时

  输出到数据库Ӟ原理与输出到览器也是一L。本节只是ServletZQJSP的情况请读者自行推对{?br />
  假设有一个ServletQ它能接收来自客LQIEQ简体中文)的汉字字W串Q然后把它写入到内码为ISO8859-1的数据库中,然后再从数据库中取出q个字符Ԍ昄到客L?br />
  ? 输出对象是数据库时的变化q程Q?Q?br />
序号步骤说明l果?/td>
1在IE中输入“中文?/td>D6 D0 CE C4IE
2IE把字W串转变成UTFQƈ送入传输中E4 B8 AD E6 96 87
3Servlet接收到输入流Q用readUTFd4E 2D 65 87(unicode)Servlet
4~程者在Servlet中必L字符串根据GB2312q原为字节流D6 D0 CE C4
5~程者根据数据库内码ISO8859-1生成新的字符?/td>00 D6 00 D0 00 CE 00 C4
6把新生成的字W串提交lJDBC00 D6 00 D0 00 CE 00 C4
7JDBC到数据库内码ؓISO8859-100 D6 00 D0 00 CE 00 C4JDBC
8JDBC把接收到的字W串按照ISO8859-1生成字节?/td>D6 D0 CE C4
9JDBC把字节流写入数据库中D6 D0 CE C4
10完成数据存储工作D6 D0 CE C4 数据?/td>
以下是从数据库中取出数的q程
11JDBC从数据库中取出字节流D6 D0 CE C4JDBC
12JDBC按照数据库的字符集ISO8859-1生成字符Ԍq提交给Servlet00 D6 00 D0 00 CE 00 C4 (Unicode) 
13Servlet获得字符?/td>00 D6 00 D0 00 CE 00 C4 (Unicode)Servlet
14~程者必L据数据库的内码ISO8859-1q原成原始字节流D6 D0 CE C4 
15~程者必L据客L字符集GB2312生成新的字符?/td>4E 2D 65 87
QUnicodeQ?/td>
 
Servlet准备把字W串输出到客L
16ServletҎQServlet-charsetQ生成字节流D6D0 CE C4Servlet
17Servlet把字节流输出到IE中,如果已指定<Servlet-charsetQ,q会讄IE的编码ؓQServlet-charsetQ?/td>D6 D0 CE C4
18IEҎ指定的编码或默认~码查看l果“中文”(正确昄Q?/td>IE

  解释一下,表中W?W?步和W?5W?6步是用红色标记的Q表Cq码者来作{换。第4?两步其实是一句话Q“new String(source.getBytes("GB2312"), "ISO8859-1")”。第15?6两步也是一句话Q“new String(source.getBytes("ISO8859-1"), "GB2312")”。亲q读者,你在q样~写代码时是否意识到了其中的每一个细节呢Q?br />
  至于客户端内码和数据库内码ؓ其它值时的流E,和输出对象是pȝ控制台时的流E,误者自己想吧。明白了上述程的原理,怿你可以轻村֜写出来?br />
  行文xQ已可告一D落了。终点又回到了v点,对于~程者而言Q几乎是什么媄响都没有?br />
  因ؓ我们早就被告之要q么做了?br />
  以下l出一个结论,作ؓl尾?br />
  1?在Jsp文g中,要指定contentTypeQ其中,charset的D与客L览器所用的字符集一P对于其中的字W串帔RQ不需做Q何内码{换;对于字符串变量,要求能根据ContentType中指定的字符集还原成客户端能识别的字节流Q简单地_是“字W串变量是基于<Jsp-charsetQ字W集的”;

  2?在Servlet中,必须用HttpServletResponse.setContentType()讄charsetQ且讄成与客户端内码一_对于其中的字W串帔RQ需要在Javac~译时指定encodingQ这个encoding必须与编写源文g的^台的字符集一P一般说来都是GB2312或GBKQ对于字W串变量Q与JSP一P必须“是ZQServlet-charsetQ字W集的”?/span>

Sayyid 2006-05-22 17:01 发表评论
]]>
对于初学者学习Java语言的徏?转蝲)http://www.tkk7.com/Sayyid/archive/2006/05/04/44491.htmlSayyidSayyidWed, 03 May 2006 17:15:00 GMThttp://www.tkk7.com/Sayyid/archive/2006/05/04/44491.htmlhttp://www.tkk7.com/Sayyid/comments/44491.htmlhttp://www.tkk7.com/Sayyid/archive/2006/05/04/44491.html#Feedback0http://www.tkk7.com/Sayyid/comments/commentRss/44491.htmlhttp://www.tkk7.com/Sayyid/services/trackbacks/44491.html      都凌?点多了,朋友们还在玩Q没有睡意,闲着看看|页Q忽然想起了前几天看的这文章,又找来脓出来~
原文:http://www.eDaYang.Com/trackback.asp?tbID=10

      初学者的d是掌握Java的语a规则和养成良好的~程习惯Q其ơ才谈到对类库用的熟练E度Q再其次是OO思想的掌握与应用Q再其次是Design Pattern的问题了。?br />      在这里我只想介绍几个Ҏ功完成第一个阶D很有用的资料。?br />      以下按照循序渐进的顺序进行: 
      1.The Java Tutorial和它的examples:
              ftp://ftp.javasoft.com/docs/tutorial.zip
               ftp://ftp.javasoft.com/docs/tut-examples.zip
               以上资料学习完成后,请参看以下资料:
       2.Java2 Certification Tutorial: 
              http://automation.seu.edu.cn/auto/content/tutorial.zip
       3.Complete Java 2 Certification Study Guide: 
              http://www.3344520.net/book/3344520...va013.zip&id=65
      以上两个资料都是备考SCJP用的Q十分注重语a规范的学习与考察Q可以先?Q因?相对l,?讲解更加l致入微。在看以上资料的同时Q你免不了写些程序,q就要用到API的手册,你用的是JDK的那个版本就?java.sun.com 下蝲那个版本的doc来用p了,全称叫:Java 2 SDK, Standard|Enterprise|Micro Edition, v1.4.0(q有其他) beta 3 Documentation.
     以上提供的资料都是英文资料,?font color="#000080">技术资料中没有复杂的语法,而且如果你想成ؓ一个优U的JavaE序员也必须要过阅读英文资料q一养Iȝ着别h把新资料译成中文给你看Q你的步伐就永远会比别h慢一步。所以,我希望处在初学阶D늚朋友可以借这个机会锻DU读英文资料的能?/strong>?/font>
      如果你学qC++Q请在学习过E中比较两种语言的异同,会收到更好效果。当Ӟ你也可以把C++和Java攑֜一起学习,有h说这样学习会出现hQ但万事不可一概而论Q有的h通过q种比较的学习方式,可能会掌握的更好。一Lȝ样hQ我告诉你,8爪型的都?..(抱歉Q正在看鹉K讎ͼ串词儿了)...
最后希望初学者们学习利?



Sayyid 2006-05-04 01:15 发表评论
]]>
Eclipse快捷键大?/title><link>http://www.tkk7.com/Sayyid/archive/2006/04/27/43641.html</link><dc:creator>Sayyid</dc:creator><author>Sayyid</author><pubDate>Thu, 27 Apr 2006 10:33:00 GMT</pubDate><guid>http://www.tkk7.com/Sayyid/archive/2006/04/27/43641.html</guid><wfw:comment>http://www.tkk7.com/Sayyid/comments/43641.html</wfw:comment><comments>http://www.tkk7.com/Sayyid/archive/2006/04/27/43641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Sayyid/comments/commentRss/43641.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Sayyid/services/trackbacks/43641.html</trackback:ping><description><![CDATA[ <p>Eclipse快捷键大?以前觉得q些东西没什么用Q主要是那时q没用eclipseQ现在刚开始用eclipseQ这些东西算是配上用Z?br />(一下内Ҏ源于|络)<br />Ctrl+1 快速修?br />Ctrl+D: 删除当前?<br />Ctrl+Alt+?复制当前行到下一?复制增加)<br />Ctrl+Alt+?复制当前行到上一?复制增加)</p> <p>Alt+?当前行和下面一行交互位|?特别实用,可以省去先剪?再粘贴了)<br />Alt+?当前行和上面一行交互位|?同上)<br />Alt+?前一个编辑的面<br />Alt+?下一个编辑的面(当然是针对上面那条来说了)</p> <p>Alt+Enter 昄当前选择资源(工程,or 文g or文g)的属?/p> <p>Shift+Enter 在当前行的下一行插入空?q时鼠标可以在当前行的Q一位置,不一定是最?<br />Shift+Ctrl+Enter 在当前行插入I(原理同上?</p> <p>Ctrl+Q 定位到最后编辑的地方<br />Ctrl+L 定位在某?(对于E序过100的h有音?<br />Ctrl+M 最大化当前的Edit或View (再按则反?<br />Ctrl+/ 注释当前?再按则取消注?br />Ctrl+O 快速显C?OutLine<br />Ctrl+T 快速显C当前类的承结?br />Ctrl+W 关闭当前Editer<br />Ctrl+K 参照选中的Word快速定位到下一?br />Ctrl+E 快速显C当前Editer的下拉列?如果当前面没有昄的用黑体表示)</p> <p>Ctrl+/(键? 折叠当前cM的所有代?/p> <p>Ctrl+×(键? 展开当前cM的所有代?/p> <p>Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代?</p> <p>Ctrl+Shift+E 昄理当前打开的所有的View的管理器(可以选择关闭,Ȁzȝ操作)</p> <p>Ctrl+J 正向增量查找(按下Ctrl+J?你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显C没有找C,查一个单词时,特别实用,q个功能Idea两年前就有了)</p> <p>Ctrl+Shift+J 反向增量查找(和上条相?只不q是从后往前查)</p> <p>Ctrl+Shift+F4 关闭所有打开的Editer</p> <p>Ctrl+Shift+X 把当前选中的文本全部变呛_?/p> <p>Ctrl+Shift+Y 把当前选中的文本全部变为小?/p> <p>Ctrl+Shift+F 格式化当前代?/p> <p>Ctrl+Shift+P 定位到对于的匚wW?譬如{}) (从前面定位后面时,光标要在匚wW里?后面到前?则反?</p> <p>下面的快捷键是重构里面常用的,本hp己喜Ƣ且常用的整理一??一般重构的快捷键都是Alt+Shift开头的?</p> <p>Alt+Shift+R 重命?(是我自己最q的一个了,其是变量和cȝRename,比手工方法能节省很多力_?</p> <p>Alt+Shift+M 抽取Ҏ (q是重构里面最常用的方法之一?其是对一大堆泥团代码有用)</p> <p>Alt+Shift+C 修改函数l构(比较实用,有N个函数调用了q个Ҏ,修改一ơ搞?</p> <p>Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变?其是多处调用的时?</p> <p>Alt+Shift+F 把Class中的local变量变ؓfield变量 (比较实用的功?</p> <p>Alt+Shift+I 合ƈ变量(可能q样说有点不妥Inline)<br />Alt+Shift+V Ud函数和变?不怎么常用)<br />Alt+Shift+Z 重构的后悔药(Undo)</p> <img src ="http://www.tkk7.com/Sayyid/aggbug/43641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Sayyid/" target="_blank">Sayyid</a> 2006-04-27 18:33 <a href="http://www.tkk7.com/Sayyid/archive/2006/04/27/43641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 Eclipse从入门到_N?/title><link>http://www.tkk7.com/Sayyid/archive/2006/03/07/34127.html</link><dc:creator>Sayyid</dc:creator><author>Sayyid</author><pubDate>Tue, 07 Mar 2006 10:12:00 GMT</pubDate><guid>http://www.tkk7.com/Sayyid/archive/2006/03/07/34127.html</guid><wfw:comment>http://www.tkk7.com/Sayyid/comments/34127.html</wfw:comment><comments>http://www.tkk7.com/Sayyid/archive/2006/03/07/34127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Sayyid/comments/commentRss/34127.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Sayyid/services/trackbacks/34127.html</trackback:ping><description><![CDATA[<P>    以前看网上说q书q不?之后M店买了这本书,攑֜书架上一直没好好?前几天大概的看了?觉得书中主要是讲SWT,对于不用SWT的初学者来?帮不上很大的?</P><img src ="http://www.tkk7.com/Sayyid/aggbug/34127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Sayyid/" target="_blank">Sayyid</a> 2006-03-07 18:12 <a href="http://www.tkk7.com/Sayyid/archive/2006/03/07/34127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习thinking in java的困惑(求助Q?http://www.tkk7.com/Sayyid/archive/2006/01/26/29237.htmlSayyidSayyidThu, 26 Jan 2006 03:54:00 GMThttp://www.tkk7.com/Sayyid/archive/2006/01/26/29237.htmlhttp://www.tkk7.com/Sayyid/comments/29237.htmlhttp://www.tkk7.com/Sayyid/archive/2006/01/26/29237.html#Feedback6http://www.tkk7.com/Sayyid/comments/commentRss/29237.htmlhttp://www.tkk7.com/Sayyid/services/trackbacks/29237.html   对于JAVA语言,我也看过几本基础的书,然后才看的THINKING IN JAVA,可是看了好久觉得很难?有很多东西书上讲的很详细,q些内容是其他书上都没涉及到?我努力去理解他上面讲的每一点东?发现来困难了,所以现在开始怀疑我的学习方法是否存在问题了.今天来这里向大家求助^
   我想问问大家,q本书你们是怎么学习,有什么好的方法请大家指教!
      ?看的时候是有选择的看q是_读???
      ?把这本书看完大概要多时???
      ?nbsp;书上有很多代?是不是都要去看懂???
    好了先写这么一点了,{再遇上问题在来求教,希望各位有经验的朋友帮帮? 在此我表C忠心的感谢!

Sayyid 2006-01-26 11:54 发表评论
]]>
文g名与cd一致性的问题(新手、基)http://www.tkk7.com/Sayyid/archive/2006/01/05/26804.htmlSayyidSayyidThu, 05 Jan 2006 14:31:00 GMThttp://www.tkk7.com/Sayyid/archive/2006/01/05/26804.htmlhttp://www.tkk7.com/Sayyid/comments/26804.htmlhttp://www.tkk7.com/Sayyid/archive/2006/01/05/26804.html#Feedback0http://www.tkk7.com/Sayyid/comments/commentRss/26804.htmlhttp://www.tkk7.com/Sayyid/services/trackbacks/26804.html文g名与cd一致性的问题
如果文g只有一个类Q文件名必须与类名一?BR>如果文g?FONT color=#0000ff>不止一个类Q文件名必须与含publiccȝcd保持一?BR>如果文g?FONT color=#0000ff>不止一个类Q且没有publicc,文g名可以与其他cd一?BR>如果文g中有main函数Q?FONT color=#ff1493>也有publicc,main函数必须位于publiccM
如果文g中有main函数Q?FONT color=#ff1493>没有publicc,文g名与含有main函数的类名一?BR>注:忘了在那本书上看的,可能记得不清楚,如有问题Q请指教Q?/FONT>



Sayyid 2006-01-05 22:31 发表评论
]]>
վ֩ģ壺 avרߵӰ| ؼëƬߴȫѲ| þþþþ99avվ| ޾Һһ| ݺ޺ݺŷ2019| 99ƷƵѹۿ| ޳AVƬWWW| þ޾Ʒۺ| ƷþþþþþѼձ| þavСݲ| ɫavɫ߹| ղƷϵ| 57paoƵѲ| ձһѹۿ | avһۿ| ģ߹ۿ| 99ƷƵ߹ۿ| ѾþҹƷ| vavavaӰĻ | Ļ߹ۿ| ߹ۿ| Ļ߾ƷѹۿƵ| eeussӰԺ92242| ŷa߹ۿ| ޸߹ۿ| av2018| èwww˳| ѰvƷƵַ| С˵ɫͼ| Ů߲ͬ| AVרAVJULIA| ƬѹۿĻ| avһ| 13СϴƵվ| ޾ƷŮ2020þ| Ұһ| þþƷ޾Ʒɫ| ޾Ʒ˳| ŷ޾þþþƷ| һëƬڲƵ| ȫƵѸ|