??xml version="1.0" encoding="utf-8" standalone="yes"?> q是一个世界范围内都存在的问题Q所以,Java提供了世界性的解决Ҏ。本文描q的Ҏ是用于处?nobr>中文的,但是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有兴趣的可以浏?#8220;http://www.unicode.org/”查看更多的信息。Unicode有一个特
性:它包括了世界上所有的字符字Ş。所以,各个地区的语a都可以徏立与Unicode的映关p,而Java正是利用了这一点以辑ֈ异种语言之间的{换?/p>
在JDK中,与中文相关的~码有: ? JDK中与中文相关的编码列?br />
~码名称
说明
ASCII
7位,与ascii7相同
ISO8859-1
8-位,?8859_1,ISO-8859-1,ISO_8859-1,latin1...{相?/td>
GB2312-80
16位,与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么会?#8220;?”?/p>
上文说过Q异U语a之间的{换是通过Unicode来完成的。假设有两种不同的语aA和BQ{换的步骤为:先把A转化为UnicodeQ再把Unicode转化为B?/p>
举例说明。有GB2312中有一个汉?#8220;?#8221;Q其~码?#8220;C0EE”Q欲转化为ISO8859-1~码。步骤ؓQ先?#8220;?#8221;字{化ؓ UnicodeQ得?#8220;674E”Q再?#8220;674E”转化为ISO8859-1字符。当Ӟq个映射不会成功Q因为ISO8859-1中根本就没有? “674E”对应的字W?/p>
当映不成功Ӟ问题发生了Q当从某语言向Unicode转化Ӟ如果在某语言中没有该字符Q得到的是Unicode的代?#8220;" uffffd”Q?#8220;"u”表示是Unicode~码Q)。而从Unicode向某语言转化Ӟ如果某语a没有对应的字W,则得到的?#8220;0x3f” Q?#8220;?”Q。这是“?”的由来?/p>
例如Q把字符buf =“0x80 0x40 0xb0 0xa1”q行new String(buf, "gb2312")操作Q得到的l果?#8220;"ufffd"u554a”Q再println出来Q得到的l果是“??#8221;Q因?#8220;0x80 0x40”是GBK中的字符Q在GB2312中没有?/p>
再如Q把字符串String=""u00d6"u00ec"u00e9"u0046"u00bb"u00f9"q行new String (buf.getBytes("GBK"))操作Q得到的l果?#8220;3fa8aca8a6463fa8b4”Q其中,“"u00d6”?#8220;GBK”中没有对 应的字符Q得?#8220;3f”Q?#8220;"u00ec”对应着“a8ac”Q?#8220;"u00e9”对应着“a8a6”Q?#8220;0046”对应着“46”Q因是ASCII? W)Q?#8220;"u00bb”没找刎ͼ得到“3f”Q最后,“"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个字节的首位是“0”Q剩下的7位与原字W中的后7位相同,?#8220;" u0034”Q?000 0000 0011 0100Q,?#8220;34” (0011 0100)表示Q(与源Unicode字符是相同的Q;
Q?Q如果Unicode?6位字W的?位是0Q则?个字节表C,首字节是“110”开_后面?位与源字W中除去?个零后的最? 位相同;W二个字节以“10”开_后面?位与源字W中的低6位相同。如“"u025d”Q?000 0010 0101 1101Q,转化后ؓ“c99d”Q?100 1001 1001 1101Q;
Q?Q如果不W合上述两个规则Q则用三个字节表C。第一个字节以“1110”开_后四位ؓ源字W的高四位;W二个字节以“10”开_后六? 为源字符中间的六位;W三个字节以“10”开_后六位ؓ源字W的低六位;?#8220;"u9da7”Q?001 1101 1010 0111Q,转化?#8220;e9b6a7”Q?110 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即输入、处理和
再看二表示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再输出到览器、控制台?nobr>数据?/strong>{?/p>
JSPQ从源文件到Class的过E?/p>
Jsp的源文g是以“.jsp”l尾的文本文件。在本节中,阐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>”的命令解释JSP文g中出现的所有字W,包括中文字符和ASCII字符Q然后把q些字符转换成Unicode?
W,再{化成UTF格式Q存为JAVA文g。ASCII码字W{化ؓUnicode字符时只是简单地在前面加“00”Q如“A”Q{化ؓ“"u0041”
Q不需要理由,Unicode的码表就是这么编的)。然后,l过到UTF的{换,又变?#8220;41”了!q也是可以使用普通文本编辑器查看由JSP生成?
JAVA文g的原因; 3、引擎用相当?#8220;javac –encoding UNICODE”的命令,把JAVA文g~译成CLASS文gQ?/p>
先看一下这些过E中中文字符的{换情c有如下源代码: <%@ page contentType="text/html; charset=gb2312"%> q段代码是在UltraEdit for Windows上编写的。保存后Q?#8220;中文”两个字的16q制~码?#8220;D6 D0 CE
C4”QGB2312~码Q。经查表Q?#8220;中文”两字的Unicode~码?#8220;"u4E2D"u6587”Q用 UTF表示是“E4 B8 AD E6
96 87”。打开引擎生成的由JSP文g转变而成的JAVA文gQ发现其中的“中文”两个字确实被“E4 B8 AD E6 96
87”替代了,再查看由JAVA文g~译生成的CLASS文gQ发现结果与JAVA文g中的完全一栗?/p>
再看JSP中指定的CharSet为ISO-8859-1的情c?/p>
<%@ page contentType="text/html; charset=ISO-8859-1"%> 同样Q该文g是用UltraEdit~写的,“中文”q两个字也是存ؓGB2312~码“D6 D0 CE
C4”。先模拟一下生成的JAVA文g和CLASS文g的过E:jspc用ISO-8859-1来解?#8220;中文”Qƈ把它映射到Unicode。由于ISO
-8859-1?位的Q且是拉丁语p,其映规则就是在每个字节前加“00”Q所以,映射后的Unicode~码应ؓ“"u00D6"u00D0"
u00CE"u00C4”Q{化成UTF后应该是“C3 96 C3 90 C3 8E C3
84”。好Q打开文g看一下,JAVA文g和CLASS文g中,“中文”果然都表CZؓ“C3 96 C3 90 C3 8E C3 84”?/p>
如果上述代码中不指定<Jsp-charset>Q即把第一行写?#8220;<%@ page
contentType="text/html" %>”QJSPC会用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 />
ServletQ从源文件到Class的过E?/p>
Servlet源文件是?#8220;.java”l尾的文本文件。本节将讨论Servlet的编译过Eƈ跟踪其中的中文变化?/p>
?#8220;javac”~译Servlet源文件。javac可以?#8220;-encoding <Compile-charset>”参数Q意思是“?lt; Compile-charset >中指定的~码来解释Serlvet源文?#8221;?/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 该文件也是用UltraEdit for Windows~写的,其中?#8220;中文”两个字保存ؓ“D6 D0 CE C4”QGB2312~码Q?/p>
开始编译。下表是<Compile-charset>不同ӞCLASS文g?#8220;中文”两字的十六进制码。在~译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 />
<html><body>
<%
String a="中文";
out.println(a);
%>
</body></html>
<html><body>
<%
String a="中文";
out.println(a);
%>
</body></html>
Jsp-CharSet
JSP文g?/td>
JAVA文g?/td>
CLASS文g?/td>
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)
无(默认Qfile.encodingQ?/td>
同ISO-8859-1
同ISO-8859-1
同ISO-8859-1
下节先讨论Servlet从JAVA文g到CLASS文g的{化过E,然后再解释从CLASS文g如何输出到客L。之所以这样安排,是因为JSP和Servlet在输出时处理Ҏ是一L?/p>
{
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>");
}
}
Compile-charset
Servlet源文件中
Class文g?/td>
{效的Unicode?/td>
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前面各加了一?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~码“00D6 00D0 00CE
00C4”Q如果不作{换,直接用Unicode码表来对照它Ӟ是四个字W(而且是特D字W)Q假如把它与“ISO8859-1”q行映射Q则直接L
前面?#8220;00”卛_得到“D6 D0 CE
C4”Q这是ASCII码表中的四个字符Q而假如把它当作GB2312来进行映,得到的结果很可能是一大堆qQ因为在GB2312中有可能没有Q也?
可能有)字符?0D6{字W对应(如果对应不上Q将得到0x3fQ也是问号Q如果对应上了,׃00D6{字W太靠前Q估计也是一些特D符P真正?
汉字在Unicode中的~码?E00开始)?br />
各位看到了,同样的Unicode字符Q可以解释成不同的样子。当Ӟq其中有一U是我们期望的结果。以上例而论Q?#8220;D6 D0 CE C4”应该是我们所惌的,当把“D6 D0 CE C4”输出到IE中时Q用“
在Class输出字符串前Q会Unicode的字W串按照某一U内码重新生成字节流Q然后把字节输入,相当于进行了一?#8220;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”Q你可以试用各U内码去查看。你会发现用“体中?#8221;时能得到正确的结果。因?#8220;D6 D0 CE C4”本来是体中文中“中文”两个字的~码?br />
OKQ完整地看一遍?br />
JSPQ源文g为GB2312格式的文本文Ӟ且JSP源文件中?#8220;中文”q两个汉?br />
如果指定了<Jsp-charsetQؓGB2312Q{化过E如下表?br />
? Jsp-charset = GB2312时的变化q程
序号
步骤说明
l果
1
~写JSP源文Ӟ且存为GB2312格式
D6 D0 CE C4
QD6D0=?CEC4=文)
2
jspc把JSP源文件{化ؓ临时JAVA文gQƈ把字W串按照GB2312映射到UnicodeQƈ用UTF格式写入JAVA文g?/td>
E4 B8 AD E6 96 87
3
把时JAVA文g~译成CLASS文g
E4 B8 AD E6 96 87
4
q行Ӟ先从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
7
IE?#8220;体中?#8221;查看l果
“中文”Q正显C)
如果指定了<Jsp-charsetQؓISO8859-1Q{化过E如下表?br />
? Jsp-charset = ISO8859-1时的变化q程
序号
步骤说明
l果
1
~写JSP源文Ӟ且存为GB2312格式
D6 D0 CE C4
QD6D0=?CEC4=文)
2
jspc把JSP源文件{化ؓ临时JAVA文gQƈ把字W串按照ISO8859-1映射到UnicodeQƈ用UTF格式写入JAVA文g?/td>
C3 96 C3 90 C3 8E C3 84
3
把时JAVA文g~译成CLASS文g
C3 96 C3 90 C3 8E C3 84
4
q行Ӟ先从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
7
IE?#8220;西欧字符”查看l果
qQ其实是四个ASCII字符Q但׃大于128Q所以显C出来的怪模怪样
8
改变IE的页面编码ؓ“体中?#8221;
“中文”Q正显C)
奇怪了Qؓ什么把QJsp-charsetQ设成GB2312和ISO8859-1是一个样的,都能正确昄Q因4?中的W?步和W?步互逆,是相?#8220;抉|”的。只不过当指定ؓISO8859-1Ӟ要增加第8步操作,Dؓ不便?br />
再看看不指定QJsp-charsetQ?时的情况?br />
? 未指定Jsp-charset 时的变化q程
序号
步骤说明
l果
1
~写JSP源文Ӟ且存为GB2312格式
D6 D0 CE C4
QD6D0=?CEC4=文)
2
jspc把JSP源文件{化ؓ临时JAVA文gQƈ把字W串按照ISO8859-1映射到UnicodeQƈ用UTF格式写入JAVA文g?/td>
C3 96 C3 90 C3 8E C3 84
3
把时JAVA文g~译成CLASS文g
C3 96 C3 90 C3 8E C3 84
4
q行Ӟ先从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
7
IE用发求时的页面的~码查看l果
视情况而定。如果是体中文,则能正确昄Q否则,需执行?中的W??/td>
ServletQ源文g为JAVA文gQ格式是GB2312Q源文g中含?#8220;中文”q两个汉?br />
如果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文g
E4 B8 AD E6 96 87 QUTFQ?/td>
3
q行Ӟ先从CLASS文g中用readUTFd字符Ԍ在内存中的是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?#8220;体中?#8221;查看l果
“中文”Q正显C)
如果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文g
C3 96 C3 90 C3 8E C3 84 QUTFQ?/td>
3
q行Ӟ先从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-1
D6 D0 CE C4 (GB2312)
6
IE?#8220;西欧字符”查看l果
qQ原因同?Q?/td>
7
改变IE的页面编码ؓ“体中?#8221;
“中文”Q正显C)
如果不指定Compile-charset或Servlet-charsetQ其默认值均为ISO8859-1?br />
当Compile-charset=Servlet-charsetӞW?步和W?步能互逆,“抉|”Q显C结果均能正。读者可试着写一下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中输?#8220;中文”
D6 D0 CE C4
IE
2
IE把字W串转变成UTFQƈ送入传输中
E4 B8 AD E6 96 87
3
Servlet接收到输入流Q用readUTFd
4E 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串提交lJDBC
00 D6 00 D0 00 CE 00 C4
7
JDBC到数据库内码ؓISO8859-1
00 D6 00 D0 00 CE 00 C4
JDBC
8
JDBC把接收到的字W串按照ISO8859-1生成字节?/td>
D6 D0 CE C4
9
JDBC把字节流写入数据库中
D6 D0 CE C4
10
完成数据存储工作
D6 D0 CE C4 数据?/td>
11
JDBC从数据库中取出字节流
D6 D0 CE C4
JDBC
12
JDBC按照数据库的字符集ISO8859-1生成字符Ԍq提交给Servlet
00 D6 00 D0 00 CE 00 C4 (Unicode)
13
Servlet获得字符?/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>
16
ServletҎQServlet-charsetQ生成字节流
D6D0 CE C4
Servlet
17
Servlet把字节流输出到IE中,如果已指定<Servlet-charsetQ,q会讄IE的编码ؓQServlet-charsetQ?/td>
D6 D0 CE C4
18
IEҎ指定的编码或默认~码查看l果
“中文”Q正显C)
IE
解释一下,表中W?W?步和W?5W?6步是用红色标记的Q表Cq?
者来作{换。第4?两步其实是一句话Q?#8220;new String(source.getBytes("GB2312"),
"ISO8859-1")”。第15?6两步也是一句话Q?#8220;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简单地_是“字符串变量是ZQJsp-
charsetQ字W集?#8221;Q?br />
2?
在Servlet中,必须用HttpServletResponse.setContentType()讄charsetQ且讄成与客户端内码一_
对于其中的字W串帔RQ需要在Javac~译时指定encodingQ这个encoding必须与编写源文g的^台的字符集一P一般说来都?
GB2312或GBKQ对于字W串变量Q与JSP一P必须“是基于<Servlet-charsetQ字W集?#8221;?/span>
:set t_ti= t_te= 5、多文g~辑 打开多个文gQvim a.c b.c b.c 切换C一文gQn 切换到另一文gQe <文g名如b.c> q回上一文gQ e# 横向分屏Qsplit Q不加参Cؓ分屏当前文gQ加文g名ؓ以分屏方式打开另一文gQ?br /> 竖向分屏QvsplitQ与split不同之处在于竖向分屏 分屏后切换:ctrl+两次按w 6、删除内容到~冲?br /> x为删除光标当前字W,而X则删除光标前字符Q?br /> dd为删除当前行Q?br /> nxQnXQndd则表明删除的数目Q?br /> 7、拷贝内容到~冲?br /> yyQؓ拯当前行到~冲区; ywQؓ拯单个词到~冲区; nyyQnyw则表明拷贝的数目Q?br /> 8?nobr>Ud到某一行: : nQn?br /> ?br /> nGQn?br /> 9、visual~辑 三种q入方式Q?br /> v ---- 以字Wؓ单位q行选择 V ---- 以行为单位进行选择 ctrl+v ---- 以列块方式进行选择 ctrl+c ---- 退出visual~辑方式 q入后对选择q行的操作有Q?br /> d --- 删除 y --- 复制 > --- 右移4?br /> < --- 左移4?br /> ~ --- 大小写切?br /> U --- 变成大写 u --- 变成写 |
1. 下蝲文g
JDK jdk-1_5_0_06-linux-i586-rpm.bin http://java.sun.com
eclipse eclipse-SDK-3.1.2-linux-gtk.tar.gz http://www.eclipse.org
CDT org.eclipse.cdt-3.0.2-linux.x86.tar.gz http://www.eclipse.org/cdt
2. 安装JDK
chmod +x jdk-1_5_0_06-linux-i586-rpm.bin
./jdk-1_5_0_06-linux-i586-rpm.bin
讄环境变量Q编?etc/profileQ在下面加入
export JAVA_HOME=/usr/java/jdk1.5.0_06
export PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:/usr/java/jdk1.5.0_06/lib/tools.jar:$CLASSPATH
export CLASSPATH
3. 安装eclipse
tar -zxvf eclipse-SDK-3.1.2-linux-gtk.tar.gz
再移动到惌的目录中Q这里ؓ/opt
~写一个执行脚本,内容如下Q?/p>
#eclipse
#
export JAVA_HOME=/usr/java/jdk1.5.0_06
export CLASSPATH=/usr/java/jdk1.5.0_06/lib
/opt/eclipse/eclipse -vm /usr/java/jdk1.5.0_06/bin/java -data ~/workspace &
cp eclipse.sh /usr/local/bin
chmod 755 /usr/local/bin/eclipse.sh
eclipse.sh d到桌面。桌面上按下鼠标右键Q在弹出菜单中选择“创徏启动?#8221;Q在“名称”中输入Eclipse?#8220;命o”中填 /usr/local/bin/eclipse.shQ按“定”Q桌面上有eclipse的快h式了Q以后可以直接双击这个图标启? Eclipse?
4. 安装CDT
tar -zxvf org.eclipse.cdt-3.0.2-linux.x86.tar.gz
相映目录中的文件cp到eclipse目录?/p>
---------------------
先要在linux下安装好jreQ我的jre的安装目录是/usr/java/jre1.5
把下载的文g解压卛_Q?/span>
#tar -zxvf eclipse-SDK-3.2-linux-gtk.tar.gzQ可以加上绝对\径)
3 每个用户都可以执?/span>EclipseQ编?/span>Eclipse.sh脚本Q?/span>
#!/bin/bash
#
#exe eclipse3.2
#
/usr/eclipse/eclipse -vm /usr/java/jre1.5/bin/java -data ~/workspace &
# -vm 参数用以指定使用哪一?/span> jvm 来执?/span>EclipseQ?/span>
# -date参数用以指定Eclipse的数据目录。在此指定其存在用户根目?/span>(~)下的workspace目录?/span>
?/span>eclipse.sh 复制?/span>/usr/local/bin中,qؓ它加上权?/span>755Q现在执?/span> eclipse.sh 卛_启动 Eclipse?/span>
4桌面上徏立快h式:
在桌面上按下鼠标右键Q在弹出菜单中选择“新增启动”Q之后分別在“名称”中输?/span>Eclipse3.2Q?#8220;命o”中填 /usr/local/bin/eclipse.shQ然后再为它随便找个喜欢的图标(我用的是/opt/eclipse/icon.xpmQ?/span>;再后?/span>“定”Q桌面上有eclipse的快h式了Q以后可以直接双击这个图标启?/span>Eclipse?/span>其中W一行是一个include 语句Q?include <asm/boot.h>
而当我去查看boot.h的时候,发现它的真正位置?nbsp;"include/asm-i386/boot.h" 而不?"include/ asm/boot.h"
q让我很不解,查网上资料也没有解答, 打开makefile文g,仔细看了一?l于扑ֈ原因:
在makefile 中有q么一D?
很明?首先删除?asm文g?然后 在include 下面做了一个Yq接: ln -sf asm-$(ARCH) asm
q里的ARCH明显是系l相关的环境变量了,比如在i386机器上就是代表i386了。这样asm-i386p{成了asm.