﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-可爱的java-随笔分类-java心得体会</title><link>http://www.blogjava.net/aldmd/category/19693.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Dec 2010 20:40:13 GMT</lastBuildDate><pubDate>Mon, 13 Dec 2010 20:40:13 GMT</pubDate><ttl>60</ttl><item><title>tomcat5.5下部署dbcp的方法</title><link>http://www.blogjava.net/aldmd/archive/2010/12/13/340529.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Mon, 13 Dec 2010 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2010/12/13/340529.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/340529.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2010/12/13/340529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/340529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/340529.html</trackback:ping><description><![CDATA[首先dbcp依赖几个包<br />
commons-collections<br />
commons-pool<br />
commons-dbcp<br />
<br />
和mysql的驱动包：mysql-connector-java<br />
<br />
将以上四个包拷贝到tomcat安装路径下的commons/lib/下面<br />
<br />
然后在tomcat安装路径下的conf下找到context.xml<br />
加入如下文本：<br />
&lt;Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="100" maxIdle="30" maxWait="10000"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="root" password="******" driverClassName="com.mysql.jdbc.Driver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:mysql://localhost:3306/test"/&gt;<br />
<br />
然后在自己的所建立的服务下的web.xml中加入：<br />
&nbsp; &lt;resource-ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;DB Connection&lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-ref-name&gt;jdbc/test&lt;/res-ref-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />
&nbsp; &lt;/resource-ref&gt;<br />
<br />
以上实例参考了apache的官方教程：http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html<br />
DHCP的一些资料：http://commons.apache.org/dbcp/configuration.html<br />
还好国内暂时可以访问apache的网站啊，myeclipse相比就要郁闷很多了。<br />
<br />
<br />
<img src ="http://www.blogjava.net/aldmd/aggbug/340529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2010-12-13 17:11 <a href="http://www.blogjava.net/aldmd/archive/2010/12/13/340529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符，字节和编码</title><link>http://www.blogjava.net/aldmd/archive/2010/05/13/320795.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Thu, 13 May 2010 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2010/05/13/320795.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/320795.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2010/05/13/320795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/320795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/320795.html</trackback:ping><description><![CDATA[<h2><a name="main"></a>字符，字节和编码</h2>
<p><font size="1">[原创文章，转载请保留或注明出处：<a href="http://www.regexlab.com/zh/encoding.htm">http://www.regexlab.com/zh/encoding.htm</a>]</font></p>
<p>级别：中级</p>
<blockquote>
<p>摘要：本文介绍了字符与编码的发展过程，相关概念的正确理解。举例说明了一些实际应用中，编码的实现方法。然后，本文讲述了通常对字符与编码的几种误解，由于这些误解而导致乱码产生的原因，以及消除乱码的办法。本文的内容涵盖了&#8220;中文问题&#8221;，&#8220;乱码问题&#8221;。</p>
<p>掌握编码问题的关键是正确地理解相关概念，编码所涉及的技术其实是很简单的。因此，阅读本文时需要慢读多想，多思考。</p>
</blockquote>
<h4><a name="intro"></a>引言</h4>
<p>&#8220;字符与编码&#8221;是一个被经常讨论的话题。即使这样，时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱码，但我们并不一定理解这些办法的内在原理。而有的乱码产生的原因，实际上由于底层代码本身有问题所导致的。因此，不仅是初学者会对字符编码感到模糊，有的底层开发人员同样对字符编码缺乏准确的理解。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4><a name="develop"></a>1. 编码问题的由来，相关概念的理解</h4>
<h5>1.1 字符与编码的发展</h5>
<p>从计算机对多国语言的支持角度看，大致可以分为三个阶段：</p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1">　</td>
            <td class="top_2" noWrap align="center"><strong>系统内码</strong></td>
            <td class="top_2" align="center"><strong>说明</strong></td>
            <td class="top_2" align="center"><strong>系统</strong></td>
        </tr>
        <tr>
            <td class="con_1" noWrap>阶段一</td>
            <td class="con_2" noWrap align="center">ASCII</td>
            <td class="con_2">计算机刚开始只支持英语，其它语言不能够在计算机上存储和显示。</td>
            <td class="con_2">英文 DOS</td>
        </tr>
        <tr>
            <td class="con_1" noWrap>阶段二</td>
            <td class="con_2" noWrap align="center">ANSI编码<br />
            （本地化）</td>
            <td class="con_2">为使计算机支持更多语言，通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如：汉字 '中' 在中文操作系统中，使用 [0xD6,0xD0] 这两个字节存储。<br />
            <br />
            不同的国家和地区制定了不同的标准，由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式，称为<strong> ANSI 编码</strong>。在简体中文系统下，ANSI 编码代表 GB2312 编码，在日文操作系统下，ANSI 编码代表 JIS 编码。<br />
            <br />
            不同 ANSI 编码之间互不兼容，当信息在国际间交流时，无法将属于两种语言的文字，存储在同一段<strong> ANSI 编码</strong>的文本中。</td>
            <td class="con_2">中文 DOS，中文 Windows 95/98，日文 Windows 95/98</td>
        </tr>
        <tr>
            <td class="bot_1" noWrap>阶段三</td>
            <td class="bot_2" noWrap align="center">UNICODE<br />
            （国际化）</td>
            <td class="bot_2">为了使国际间信息交流更加方便，国际组织制定了 <strong>UNICODE 字符集</strong>，为各种语言中的每一个字符设定了统一并且唯一的数字编号，以满足跨语言、跨平台进行文本转换、处理的要求。</td>
            <td class="bot_2">Windows NT/2000/XP，Linux，Java</td>
        </tr>
    </tbody>
</table>
<p>字符串在内存中的存放方法：</p>
<p>在 ASCII 阶段，<strong>单字节字符串</strong>使用一个字节存放一个字符（SBCS）。比如，"Bob123" 在内存中为：</p>
<table style="font-size: 80%; color: #000080" cellspacing="5" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td>42</td>
            <td>6F</td>
            <td>62</td>
            <td>31</td>
            <td>32</td>
            <td>33</td>
            <td>00</td>
        </tr>
        <tr>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
        </tr>
        <tr>
            <td align="center">B</td>
            <td align="center">o</td>
            <td align="center">b</td>
            <td align="center">1</td>
            <td align="center">2</td>
            <td align="center">3</td>
            <td align="center">\0</td>
        </tr>
    </tbody>
</table>
<p>在使用 ANSI 编码支持多种语言阶段，每个字符使用一个字节或多个字节来表示（MBCS），因此，这种方式存放的字符也被称作<strong>多字节字符</strong>。比如，"中文123" 在中文 Windows 95 内存中为7个字节，每个汉字占2个字节，每个英文和数字字符占1个字节：</p>
<table style="font-size: 80%; color: #000080" cellspacing="5" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td>D6</td>
            <td>D0</td>
            <td>CE</td>
            <td>C4</td>
            <td>31</td>
            <td>32</td>
            <td>33</td>
            <td>00</td>
        </tr>
        <tr>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#000080"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
        </tr>
        <tr>
            <td align="center" colspan="2">中</td>
            <td align="center" colspan="2">文</td>
            <td align="center">1</td>
            <td align="center">2</td>
            <td align="center">3</td>
            <td align="center">\0</td>
        </tr>
    </tbody>
</table>
<p>在 UNICODE 被采用之后，计算机存放字符串时，改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节（16 位）来存放一个序号（DBCS），因此，这种方式存放的字符也被称作<strong>宽字节字符</strong>。比如，字符串 "中文123" 在 Windows 2000 下，内存中实际存放的是 5 个序号：</p>
<table style="font-size: 80%; color: #000080" cellspacing="5" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="bottom">2D</td>
            <td valign="bottom">4E</td>
            <td valign="bottom">87</td>
            <td valign="bottom">65</td>
            <td valign="bottom">31</td>
            <td valign="bottom">00</td>
            <td valign="bottom">32</td>
            <td valign="bottom">00</td>
            <td valign="bottom">33</td>
            <td valign="bottom">00</td>
            <td valign="bottom">00</td>
            <td valign="bottom">00</td>
            <td><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp; &#8592; 在 x86 CPU 中，低字节在前</font></td>
        </tr>
        <tr>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
            <td><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1" border="0"  alt="" /></td>
        </tr>
        <tr>
            <td align="center" colspan="2">中</td>
            <td align="center" colspan="2">文</td>
            <td align="center" colspan="2">1</td>
            <td align="center" colspan="2">2</td>
            <td align="center" colspan="2">3</td>
            <td align="center" colspan="2">\0</td>
            <td align="center">　</td>
        </tr>
    </tbody>
</table>
<p>一共占 10 个字节。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5><a name="concept"></a>1.2 字符，字节，字符串</h5>
<p>理解编码的关键，是要把字符的概念和字节的概念理解准确。这两个概念容易混淆，我们在此做一下区分：</p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1">　</td>
            <td class="top_2" align="center"><strong>概念描述</strong></td>
            <td class="top_2" align="center"><strong>举例</strong></td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">字符</td>
            <td class="con_2">人们使用的记号，抽象意义上的一个符号。</td>
            <td class="con_2">'1', '中', 'a', '$', '￥', &#8230;&#8230;</td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">字节</td>
            <td class="con_2">计算机中存储数据的单元，一个8位的二进制数，是一个很具体的存储空间。</td>
            <td class="con_2">0x01, 0x45, 0xFA, &#8230;&#8230;</td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">ANSI<br />
            字符串</td>
            <td class="con_2">在内存中，如果&#8220;字符&#8221;是以 <strong>ANSI 编码</strong>形式存在的，一个字符可能使用一个字节或多个字节来表示，那么我们称这种字符串为 <strong>ANSI 字符串</strong>或者<strong>多字节字符串</strong>。</td>
            <td class="con_2">"中文123"<br />
            <span class="rem">（占7字节）</span></td>
        </tr>
        <tr>
            <td class="bot_1" noWrap align="center">UNICODE<br />
            字符串</td>
            <td class="bot_2">在内存中，如果&#8220;字符&#8221;是以在 UNICODE 中的序号存在的，那么我们称这种字符串为 <strong>UNICODE 字符串</strong>或者<strong>宽字节字符串</strong>。</td>
            <td class="bot_2">L"中文123"<br />
            <span class="rem">（占10字节）</span></td>
        </tr>
    </tbody>
</table>
<p>由于不同 ANSI 编码所规定的标准是不相同的，因此，对于一个给定的<strong>多字节字符串</strong>，我们必须知道它采用的是哪一种编码规则，才能够知道它包含了哪些&#8220;字符&#8221;。而对于 <strong>UNICODE 字符串</strong>来说，不管在什么环境下，它所代表的&#8220;字符&#8221;内容总是不变的。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>1.3 字符集与编码</h5>
<table id="ggad_box_3" style="display: none; float: right" cellspacing="0" cellpadding="0" width="208" bgcolor="#eae7e3" border="0">
    <tbody>
        <tr>
            <td><img height="4" alt="" src="http://www.regexlab.com/images/ggad3box_01.gif" width="4" /></td>
            <td width="200" background="../images/ggad3box_02.gif"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1"  alt="" /></td>
            <td><img height="4" alt="" src="http://www.regexlab.com/images/ggad3box_03.gif" width="4" /></td>
        </tr>
        <tr>
            <td background="../images/ggad3box_04.gif"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1"  alt="" /></td>
            <td align="right"><a href="javascript:close_ggad_box(3)"><img height="16" src="http://www.regexlab.com/images/ggad3box_close.gif" width="16" border="0"  alt="" /></a></td>
            <td background="../images/ggad3box_06.gif"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1"  alt="" /></td>
        </tr>
        <tr>
            <td background="../images/ggad3box_04.gif"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1"  alt="" /></td>
            <td height="200">
            <p id="ggad_3"><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 200px; padding-top: 0px; border-bottom: medium none; position: relative; height: 200px"><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; display: block; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 200px; padding-top: 0px; border-bottom: medium none; position: relative; height: 200px"><iframe id="google_ads_frame2" style="left: 0px; position: absolute; top: 0px" name="google_ads_frame" marginwidth="0" marginheight="0" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-0994550267179056&amp;output=html&amp;h=200&amp;slotname=8063252029&amp;w=200&amp;lmt=1273582040&amp;flash=10.0.32.18&amp;url=http%3A%2F%2Fwww.regexlab.com%2Fzh%2Fencoding.htm&amp;dt=1273729940913&amp;shv=r20100422&amp;prev_fmts=468x60_as&amp;correlator=1273729939303&amp;frm=0&amp;ga_vid=1668211939.1273729939&amp;ga_sid=1273729939&amp;ga_hid=1728958138&amp;ga_fc=0&amp;u_tz=480&amp;u_his=0&amp;u_java=1&amp;u_h=800&amp;u_w=1280&amp;u_ah=770&amp;u_aw=1280&amp;u_cd=32&amp;u_nplug=0&amp;u_nmime=0&amp;biw=1266&amp;bih=666&amp;fu=0&amp;ifi=2&amp;dtd=15&amp;xpc=4Iklje7InP&amp;p=http%3A//www.regexlab.com" frameborder="0" width="200" scrolling="no" height="200" allowTransparency></iframe></ins></ins></p>
            </td>
            <td background="../images/ggad3box_06.gif"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1"  alt="" />
            <div id="ggadcode_3" style="display: none"><script type="text/javascript"><!-- google_ad_client="pub-0994550267179056" ; google_ad_slot="8063252029" ; google_ad_width="200;
" google_ad_height="200;
"        //--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 200px; padding-top: 0px; border-bottom: medium none; position: relative; height: 200px"><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; display: block; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 200px; padding-top: 0px; border-bottom: medium none; position: relative; height: 200px"><iframe id="google_ads_frame2" style="left: 0px; position: absolute; top: 0px" name="google_ads_frame" marginwidth="0" marginheight="0" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-0994550267179056&amp;output=html&amp;h=200&amp;slotname=8063252029&amp;w=200&amp;lmt=1273582040&amp;flash=10.0.32.18&amp;url=http%3A%2F%2Fwww.regexlab.com%2Fzh%2Fencoding.htm&amp;dt=1273729940913&amp;shv=r20100422&amp;prev_fmts=468x60_as&amp;correlator=1273729939303&amp;frm=0&amp;ga_vid=1668211939.1273729939&amp;ga_sid=1273729939&amp;ga_hid=1728958138&amp;ga_fc=0&amp;u_tz=480&amp;u_his=0&amp;u_java=1&amp;u_h=800&amp;u_w=1280&amp;u_ah=770&amp;u_aw=1280&amp;u_cd=32&amp;u_nplug=0&amp;u_nmime=0&amp;biw=1266&amp;bih=666&amp;fu=0&amp;ifi=2&amp;dtd=15&amp;xpc=4Iklje7InP&amp;p=http%3A//www.regexlab.com" frameborder="0" width="200" scrolling="no" height="200" allowTransparency></iframe></ins></ins></div>
            </td>
        </tr>
        <tr>
            <td><img height="4" alt="" src="http://www.regexlab.com/images/ggad3box_07.gif" width="4" /></td>
            <td width="200" background="../images/ggad3box_08.gif" height="4"><img height="1" src="http://www.regexlab.com/images/spacer.gif" width="1"  alt="" /></td>
            <td><img height="4" alt="" src="http://www.regexlab.com/images/ggad3box_09.gif" width="4" /></td>
        </tr>
    </tbody>
</table>
<p>各个国家和地区所制定的不同 ANSI 编码标准中，都只规定了各自语言所需的&#8220;字符&#8221;。比如：汉字标准（GB2312）中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义：</p>
<ol>
    <li>使用哪些字符。也就是说哪些汉字，字母和符号会被收入标准中。所包含&#8220;字符&#8221;的集合就叫做&#8220;<strong>字符集</strong>&#8221;。
    <li>规定每个&#8220;字符&#8221;分别用一个字节还是多个字节存储，用哪些字节来存储，这个规定就叫做&#8220;<strong>编码</strong>&#8221;。 </li>
</ol>
<p>各个国家和地区在制定编码标准的时候，&#8220;字符的集合&#8221;和&#8220;编码&#8221;一般都是同时制定的。因此，平常我们所说的&#8220;字符集&#8221;，比如：GB2312, GBK, JIS 等，除了有&#8220;字符的集合&#8221;这层含义外，同时也包含了&#8220;编码&#8221;的含义。</p>
<p>&#8220;<strong>UNICODE 字符集</strong>&#8221;包含了各种语言中使用到的所有&#8220;字符&#8221;。用来给 UNICODE 字符集编码的标准有很多种，比如：UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>1.4 常用的编码简介</h5>
<p>简单介绍一下常用的编码规则，为后边的章节做一个准备。在这里，我们根据编码规则的特点，把所有的编码分成三类：</p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1" align="center"><strong>分类</strong></td>
            <td class="top_2" align="center"><strong>编码标准</strong></td>
            <td class="top_2" align="center"><strong>说明</strong></td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">单字节字符编码</td>
            <td class="con_2">ISO-8859-1</td>
            <td class="con_2">最简单的编码规则，每一个字节直接作为一个 UNICODE 字符。比如，[0xD6, 0xD0] 这两个字节，通过 iso-8859-1 转化为字符串时，将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符，即 "&#214;&#208;"。<br />
            <br />
            反之，将 UNICODE 字符串通过 iso-8859-1 转化为字节串时，只能正常转化 0~255 范围的字符。</td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">ANSI 编码</td>
            <td class="con_2">GB2312,<br />
            BIG5,<br />
            Shift_JIS,<br />
            ISO-8859-2 &#8230;&#8230;</td>
            <td class="con_2">把 UNICODE 字符串通过 ANSI 编码转化为&#8220;字节串&#8221;时，根据各自编码的规定，一个 UNICODE 字符可能转化成一个字节或多个字节。<br />
            <br />
            反之，将字节串转化成字符串时，也可能多个字节转化成一个字符。比如，[0xD6, 0xD0] 这两个字节，通过 GB2312 转化为字符串时，将得到 [0x4E2D] 一个字符，即 '中' 字。<br />
            <br />
            &#8220;ANSI 编码&#8221;的特点：<br />
            1. 这些&#8220;ANSI 编码标准&#8221;都只能处理各自语言范围之内的 UNICODE 字符。<br />
            2. &#8220;UNICODE 字符&#8221;与&#8220;转换出来的字节&#8221;之间的关系是人为规定的。</td>
        </tr>
        <tr>
            <td class="bot_1" noWrap align="center">UNICODE 编码</td>
            <td class="bot_2">UTF-8,<br />
            UTF-16, UnicodeBig &#8230;&#8230;</td>
            <td class="bot_2">与&#8220;ANSI 编码&#8221;类似的，把字符串通过 UNICODE 编码转化成&#8220;字节串&#8221;时，一个 UNICODE 字符可能转化成一个字节或多个字节。<br />
            <br />
            与&#8220;ANSI 编码&#8221;不同的是：<br />
            1. 这些&#8220;UNICODE 编码&#8221;能够处理所有的 UNICODE 字符。<br />
            2. &#8220;UNICODE 字符&#8221;与&#8220;转换出来的字节&#8221;之间是可以通过计算得到的。</td>
        </tr>
    </tbody>
</table>
<p>我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节，我们只需要知道&#8220;编码&#8221;的概念就是把&#8220;字符&#8221;转化成&#8220;字节&#8221;就可以了。对于&#8220;UNICODE 编码&#8221;，由于它们是可以通过计算得到的，因此，在特殊的场合，我们可以去了解某一种&#8220;UNICODE 编码&#8221;是怎样的规则。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4><a name="implement"></a>2. 字符与编码在程序中的实现</h4>
<h5>2.1 程序中的字符与字节</h5>
<p>在 C++ 和 Java 中，用来代表&#8220;字符&#8221;和&#8220;字节&#8221;的数据类型，以及进行编码的方法：</p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1" align="center"><strong>类型或操作</strong></td>
            <td class="top_2" align="center"><strong>C++</strong></td>
            <td class="top_2" align="center"><strong>Java</strong></td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">字符</td>
            <td class="con_2">wchar_t</td>
            <td class="con_2">char</td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">字节</td>
            <td class="con_2">char</td>
            <td class="con_2">byte</td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">ANSI 字符串</td>
            <td class="con_2">char[]</td>
            <td class="con_2">byte[]</td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">UNICODE 字符串</td>
            <td class="con_2">wchar_t[]</td>
            <td class="con_2">String</td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">字节串&#8594;字符串</td>
            <td class="con_2">mbstowcs(), MultiByteToWideChar()</td>
            <td class="con_2">string = new String(bytes, "encoding")</td>
        </tr>
        <tr>
            <td class="bot_1" noWrap align="center">字符串&#8594;字节串</td>
            <td class="bot_2">wcstombs(), WideCharToMultiByte()</td>
            <td class="bot_2">bytes = string.getBytes("encoding")</td>
        </tr>
    </tbody>
</table>
<p>以上需要注意几点：</p>
<ol>
    <li>Java 中的 char 代表一个&#8220;UNICODE 字符（宽字节字符）&#8221;，而 C++ 中的 char 代表一个字节。
    <li>MultiByteToWideChar() 和 WideCharToMultiByte() 是 Windows API 函数。 </li>
</ol>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>2.2 C++ 中相关实现方法</h5>
<p>声明一段字符串常量：</p>
<table cellspacing="0" cellpadding="6" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// ANSI 字符串，内容长度 7 字节</span><span class="key"><br />
            char</span>&nbsp;&nbsp;&nbsp;&nbsp; sz[<span class="number">20</span>] = <span class="string">"中文123"</span>;<br />
            <br />
            <span class="rem">// UNICODE 字符串，内容长度 5 个 wchar_t（10 字节）</span><br />
            wchar_t wsz[<span class="number">20</span>] = L<span class="string">"\x4E2D\x6587\x0031\x0032\x0033"</span>;</td>
        </tr>
    </tbody>
</table>
<p>UNICODE 字符串的 I/O 操作，字符与字节的转换操作：</p>
<table cellspacing="0" cellpadding="6" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// 运行时设定当前 ANSI 编码，VC 格式<br />
            </span>setlocale(LC_ALL, <span class="string">".936"</span>);<br />
            <br />
            <span class="rem">// GCC 中格式</span><br />
            setlocale(LC_ALL, <span class="string">"zh_CN.GBK"</span>);<br />
            <br />
            <span class="rem">// Visual C++ 中使用小写 %s，按照 setlocale 指定编码输出到文件<br />
            // GCC 中使用大写 %S</span><br />
            fwprintf(fp, L<span class="string">"%s\n"</span>, wsz);<br />
            <br />
            <span class="rem">// 把 UNICODE 字符串按照 setlocale 指定的编码转换成字节</span><br />
            wcstombs(sz, wsz, <span class="number">20</span>);<span class="rem"><br />
            // 把字节串按照 setlocale 指定的编码转换成 UNICODE 字符串<br />
            </span>mbstowcs(wsz, sz, <span class="number">20</span>);</td>
        </tr>
    </tbody>
</table>
<p>在 Visual C++ 中，UNICODE 字符串常量有更简单的表示方法。如果源程序的编码与当前默认 ANSI 编码不符，则需要使用 #pragma setlocale，告诉编译器源程序使用的编码：</p>
<table cellspacing="0" cellpadding="6" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// 如果源程序的编码与当前默认 ANSI 编码不一致，<br />
            // 则需要此行，编译时用来指明当前源程序使用的编码</span><span class="key"><br />
            #pragma setlocale</span>(<span class="string">".936"</span>)<br />
            <br />
            <span class="rem">// UNICODE 字符串常量，内容长度 10 字节</span><br />
            wchar_t wsz[<span class="number">20</span>] = L<span class="string">"中文123"</span>;</td>
        </tr>
    </tbody>
</table>
<p>以上需要注意 #pragma setlocale 与 setlocale(LC_ALL, "") 的作用是不同的，#pragma setlocale 在编译时起作用，setlocale() 在运行时起作用。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>2.3 Java 中相关实现方法</h5>
<p>字符串类 String 中的内容是 UNICODE 字符串：</p>
<table cellspacing="0" cellpadding="6" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// Java 代码，直接写中文</span><span class="pw"><br />
            String</span> string = <span class="string">"中文123"</span>;<br />
            <br />
            <span class="rem">// 得到长度为 5，因为是 5 个字符</span><br />
            <span class="pw">System</span>.out.println(string.length());</td>
        </tr>
    </tbody>
</table>
<p>字符串 I/O 操作，字符与字节转换操作。在 Java 包 java.io.* 中，以&#8220;Stream&#8221;结尾的类一般是用来操作&#8220;字节串&#8221;的类，以&#8220;Reader&#8221;，&#8220;Writer&#8221;结尾的类一般是用来操作&#8220;字符串&#8221;的类。</p>
<table cellspacing="0" cellpadding="6" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// 字符串与字节串间相互转化<br />
            <br />
            // 按照 GB2312 得到字节（得到多字节字符串）</span><span class="key"><br />
            byte</span> [] bytes = string.getBytes(<span class="string">"GB2312"</span>);<br />
            <br />
            <span class="rem">// 从字节按照 GB2312 得到 UNICODE 字符串</span><br />
            string = <span class="key">new</span> <span class="pw">String</span>(bytes, <span class="string">"GB2312"</span>);<br />
            <br />
            <span class="rem">// 要将 String 按照某种编码写入文本文件，有两种方法：<br />
            <br />
            // 第一种办法：用 Stream 类写入已经按照指定编码转化好的字节串</span><br />
            OutputStream os = <span class="key">new</span> FileOutputStream(<span class="string">"1.txt"</span>);<br />
            os.write(bytes);<br />
            os.close();<br />
            <br />
            <span class="rem">// 第二种办法：构造指定编码的 Writer 来写入字符串</span><br />
            Writer ow = <span class="key">new</span> OutputStreamWriter(<span class="key">new</span> FileOutputStream(<span class="string">"2.txt"</span>), <span class="string">"GB2312"</span>);<br />
            ow.write(string);<br />
            ow.close();<br />
            <br />
            <span class="rem">/* 最后得到的 1.txt 和 2.txt 都是 7 个字节 */</span></td>
        </tr>
    </tbody>
</table>
<p>如果 java 的源程序编码与当前默认 ANSI 编码不符，则在编译的时候，需要指明一下源程序的编码。比如：</p>
<table cellspacing="0" cellpadding="6" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code">E:\&gt;javac <font color="#ff0000">-encoding BIG5</font> Hello.java</td>
        </tr>
    </tbody>
</table>
<p>以上需要注意区分源程序的编码与 I/O 操作的编码，前者是在编译时起作用，后者是在运行时起作用。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4><a name="misunderstand"></a>3. 几种误解，以及乱码产生的原因和解决办法</h4>
<h5>3.1 容易产生的误解</h5>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1">　</td>
            <td class="top_2" align="center"><strong>对编码的误解</strong></td>
        </tr>
        <tr>
            <td class="con_1" noWrap align="center">误解一</td>
            <td class="con_2">在将&#8220;字节串&#8221;转化成&#8220;UNICODE 字符串&#8221;时，比如在读取文本文件时，或者通过网络传输文本时，容易将&#8220;字节串&#8221;简单地作为<strong>单字节字符串</strong>，采用每&#8220;一个字节&#8221;就是&#8220;一个字符&#8221;的方法进行转化。<br />
            <br />
            而实际上，在非英文的环境中，应该将&#8220;字节串&#8221;作为 ANSI 字符串，采用适当的编码来得到 UNICODE 字符串，有可能&#8220;多个字节&#8221;才能得到&#8220;一个字符&#8221;。<br />
            <br />
            通常，一直在英文环境下做开发的程序员们，容易有这种误解。</td>
        </tr>
        <tr>
            <td class="bot_1" noWrap align="center">误解二</td>
            <td class="bot_2">在 DOS，Windows 98 等非 UNICODE 环境下，字符串都是以 ANSI 编码的字节形式存在的。这种以字节形式存在的字符串，必须知道是哪种编码才能被正确地使用。这使我们形成了一个惯性思维：&#8220;字符串的编码&#8221;。<br />
            <br />
            当 UNICODE 被支持后，Java 中的 String 是以字符的&#8220;序号&#8221;来存储的，不是以&#8220;某种编码的字节&#8221;来存储的，因此已经不存在&#8220;字符串的编码&#8221;这个概念了。只有在&#8220;字符串&#8221;与&#8220;字节串&#8221;转化时，或者，将一个&#8220;字节串&#8221;当成一个 ANSI 字符串时，才有编码的概念。<br />
            <br />
            不少的人都有这个误解。</td>
        </tr>
    </tbody>
</table>
<p>第一种误解，往往是导致乱码产生的原因。第二种误解，往往导致本来容易纠正的乱码问题变得更复杂。</p>
<p>在这里，我们可以看到，其中所讲的&#8220;误解一&#8221;，即采用每&#8220;一个字节&#8221;就是&#8220;一个字符&#8221;的转化方法，实际上也就等同于采用 iso-8859-1 进行转化。因此，我们常常使用 bytes = string.getBytes("iso-8859-1") 来进行逆向操作，得到原始的&#8220;字节串&#8221;。然后再使用正确的 ANSI 编码，比如 string = new String(bytes, "GB2312")，来得到正确的&#8220;UNICODE 字符串&#8221;。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5><a name="instances"></a>3.2 非 UNICODE 程序在不同语言环境间移植时的乱码</h5>
<p>非 UNICODE 程序中的字符串，都是以某种 ANSI 编码形式存在的。如果程序运行时的语言环境与开发时的语言环境不同，将会导致 ANSI 字符串的显示失败。</p>
<p>比如，在日文环境下开发的非 UNICODE 的日文程序界面，拿到中文环境下运行时，界面上将显示乱码。如果这个日文程序界面改为采用 UNICODE 来记录字符串，那么当在中文环境下运行时，界面上将可以显示正常的日文。</p>
<p>由于客观原因，有时候我们必须在中文操作系统下运行非 UNICODE 的日文软件，这时我们可以采用一些工具，比如，南极星，AppLocale 等，暂时的模拟不同的语言环境。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>3.3 网页提交字符串</h5>
<p>当页面中的表单提交字符串时，首先把字符串按照当前页面的编码，转化成字节串。然后再将每个字节转化成 "%XX" 的格式提交到 Web 服务器。比如，一个编码为 GB2312 的页面，提交 "中" 这个字符串时，提交给服务器的内容为 "%D6%D0"。</p>
<p>在服务器端，Web 服务器把收到的 "%D6%D0" 转化成 [0xD6, 0xD0] 两个字节，然后再根据 GB2312 编码规则得到 "中" 字。</p>
<p>在 Tomcat 服务器中，request.getParameter() 得到乱码时，常常是因为前面提到的&#8220;误解一&#8221;造成的。默认情况下，当提交 "%D6%D0" 给 Tomcat 服务器时，request.getParameter() 将返回 [0x00D6, 0x00D0] 两个 UNICODE 字符，而不是返回一个 "中" 字符。因此，我们需要使用 bytes = string.getBytes("iso-8859-1") 得到原始的字节串，再用 string = new String(bytes, "GB2312") 重新得到正确的字符串 "中"。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>3.4 从数据库读取字符串</h5>
<p>通过数据库客户端（比如 ODBC 或 JDBC）从数据库服务器中读取字符串时，客户端需要从服务器获知所使用的 ANSI 编码。当数据库服务器发送字节流给客户端时，客户端负责将字节流按照正确的编码转化成 UNICODE 字符串。</p>
<p>如果从数据库读取字符串时得到乱码，而数据库中存放的数据又是正确的，那么往往还是因为前面提到的&#8220;误解一&#8221;造成的。解决的办法还是通过 string = new String( string.getBytes("iso-8859-1"), "GB2312") 的方法，重新得到原始的字节串，再重新使用正确的编码转化成字符串。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>3.5 电子邮件中的字符串</h5>
<p>当一段 Text 或者 HTML 通过电子邮件传送时，发送的内容首先通过一种指定的<strong>字符编码</strong>转化成&#8220;字节串&#8221;，然后再把&#8220;字节串&#8221;通过一种指定的<strong>传输编码</strong>（Content-Transfer-Encoding）进行转化得到另一串&#8220;字节串&#8221;。比如，打开一封电子邮件源代码，可以看到类似的内容：</p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code">Content-Type: text/plain;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">charset="gb2312"</font><br />
            <font color="#ff0000">Content-Transfer-Encoding: base64</font><br />
            <br />
            sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==</td>
        </tr>
    </tbody>
</table>
<p>最常用的 Content-Transfer-Encoding 有 Base64 和 Quoted-Printable 两种。在对二进制文件或者中文文本进行转化时，Base64 得到的&#8220;字节串&#8221;比 Quoted-Printable 更短。在对英文文本进行转化时，Quoted-Printable 得到的&#8220;字节串&#8221;比 Base64 更短。</p>
<p>邮件的标题，用了一种更简短的格式来标注&#8220;字符编码&#8221;和&#8220;传输编码&#8221;。比如，标题内容为 "中"，则在邮件源代码中表示为：</p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// 正确的标题格式</span><br />
            Subject: <span style="background-color: #ffff00">=?</span>GB2312<span style="background-color: #ffff00">?B?</span>1tA=<span style="background-color: #ffff00">?=</span></td>
        </tr>
    </tbody>
</table>
<p>其中，</p>
<ul>
    <li>第一个&#8220;=?&#8221;与&#8220;?&#8221;中间的部分指定了字符编码，在这个例子中指定的是 GB2312。
    <li>&#8220;?&#8221;与&#8220;?&#8221;中间的&#8220;B&#8221;代表 Base64。如果是&#8220;Q&#8221;则代表 Quoted-Printable。
    <li>最后&#8220;?&#8221;与&#8220;?=&#8221;之间的部分，就是经过 GB2312 转化成字节串，再经过 Base64 转化后的标题内容。 </li>
</ul>
<p>如果&#8220;传输编码&#8221;改为 Quoted-Printable，同样，如果标题内容为 "中"：</p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// 正确的标题格式</span><br />
            Subject: <span style="background-color: #ffff00">=?</span>GB2312<span style="background-color: #ffff00">?Q?</span>=D6=D0<span style="background-color: #ffff00">?=</span></td>
        </tr>
    </tbody>
</table>
<p>如果阅读邮件时出现乱码，一般是因为&#8220;字符编码&#8221;或&#8220;传输编码&#8221;指定有误，或者是没有指定。比如，有的发邮件组件在发送邮件时，标题 "中"：</p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span class="rem">// 错误的标题格式</span><br />
            Subject: <span style="background-color: #ffff00">=?</span><font color="#ff0000">ISO-8859-1</font><span style="background-color: #ffff00">?Q?</span>=D6=D0<span style="background-color: #ffff00">?=</span></td>
        </tr>
    </tbody>
</table>
<p>这样的表示，实际上是明确指明了标题为 [0x00D6, 0x00D0]，即 "&#214;&#208;"，而不是 "中"。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4><a name="correct"></a>4. 几种错误理解的纠正</h4>
<h5>误解：&#8220;ISO-8859-1 是国际编码？&#8221;</h5>
<p>非也。iso-8859-1 只是单字节字符集中最简单的一种，也就是&#8220;字节编号&#8221;与&#8220;UNICODE 字符编号&#8221;一致的那种编码规则。当我们要把一个&#8220;字节串&#8221;转化成&#8220;字符串&#8221;，而又不知道它是哪一种 ANSI 编码时，先暂时地把&#8220;每一个字节&#8221;作为&#8220;一个字符&#8221;进行转化，不会造成信息丢失。然后再使用 bytes = string.getBytes("iso-8859-1") 的方法可恢复到原始的字节串。</p>
<h5>误解：&#8220;Java 中，怎样知道某个字符串的内码？&#8221;</h5>
<p>Java 中，字符串类 java.lang.String 处理的是 UNICODE 字符串，不是 ANSI 字符串。我们只需要把字符串作为&#8220;抽象的符号的串&#8221;来看待。因此不存在字符串的内码的问题。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img height="1" alt="" src="http://www.regexlab.com/images/blue_rule.gif" width="100%" border="0" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellspacing="0" cellpadding="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.regexlab.com/images/u_bold.gif" width="16" border="0" /></td>
                                    <td valign="top" align="right">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/aldmd/aggbug/320795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2010-05-13 14:02 <a href="http://www.blogjava.net/aldmd/archive/2010/05/13/320795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>redhat linux as 4或者5网卡驱动的安装</title><link>http://www.blogjava.net/aldmd/archive/2009/09/22/296045.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Tue, 22 Sep 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2009/09/22/296045.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/296045.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2009/09/22/296045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/296045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/296045.html</trackback:ping><description><![CDATA[1.确认内核的版本：<br />
似乎是需要安装以下所有的内核包，如果没有可以到安装光盘上去找<br />
kernel-xen-devel-2.6.18-8.el5<br />
kernel-2.6.18-8.el5<br />
kernel-xen-2.6.18-8.el5<br />
kernel-headers-2.6.18-8.el5<br />
<br />
2.下载正确的网卡linux驱动程序，并查看readme来安装，我的流程是：<br />
<p>&nbsp;Check whether the built-in driver, r8169.ko (or r8169.o for kernel 2.4.x), is installed. <br />
&nbsp;&nbsp;# lsmod | grep r8169</p>
<p>&nbsp;If it is installed, please remove it.<br />
&nbsp;&nbsp;# rmmod r8169<br />
&nbsp;note: If the built-in driver cannot removed by rmmod, please edit /etc/modprobe.conf and comment 'alias eth0 r8169'. Then, remmove it again or reboot your computer.</p>
<p>&nbsp;Unpack the tarball :<br />
&nbsp;&nbsp;# tar vjxf r8101-1.aaa.bb.tar.bz2</p>
<p>&nbsp;Change to the directory:<br />
&nbsp;&nbsp;# cd r8101-1.aaa.bb</p>
<p>&nbsp;If you are running the target kernel, then you should be able to do :</p>
<p>&nbsp;&nbsp;# make clean modules&nbsp;(as root or with sudo)<br />
&nbsp;&nbsp;# make install<br />
&nbsp;&nbsp;# depmod -a<br />
&nbsp;&nbsp;# modprobe r8101</p>
<p>&nbsp;You can check whether the driver is loaded by using following commands.</p>
<p>&nbsp;&nbsp;# lsmod | grep r8101<br />
&nbsp;&nbsp;# ifconfig -a<br />
</p>
<br />
3.在网络设备中添加已经出现的那个驱动即可。
 <img src ="http://www.blogjava.net/aldmd/aggbug/296045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2009-09-22 16:24 <a href="http://www.blogjava.net/aldmd/archive/2009/09/22/296045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache2.2和tomcat 5.5安装和配置方法</title><link>http://www.blogjava.net/aldmd/archive/2009/04/21/266809.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Tue, 21 Apr 2009 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2009/04/21/266809.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/266809.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2009/04/21/266809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/266809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/266809.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 主要是自己记录一下安装过程，免得下此安装时忘记，希望也能给各位提个醒&nbsp;&nbsp;<a href='http://www.blogjava.net/aldmd/archive/2009/04/21/266809.html'>阅读全文</a><img src ="http://www.blogjava.net/aldmd/aggbug/266809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2009-04-21 18:09 <a href="http://www.blogjava.net/aldmd/archive/2009/04/21/266809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat中Session与cookie的深度探索（续）</title><link>http://www.blogjava.net/aldmd/archive/2007/03/31/107297.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Sat, 31 Mar 2007 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2007/03/31/107297.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/107297.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2007/03/31/107297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/107297.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/107297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 由于业务需要，昨天稍微研究了一下tomcat处理session的机制，对此有了更为深刻的理解，现在记下来，供大家参考和讨论。&nbsp;&nbsp;<a href='http://www.blogjava.net/aldmd/archive/2007/03/31/107297.html'>阅读全文</a><img src ="http://www.blogjava.net/aldmd/aggbug/107297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2007-03-31 16:39 <a href="http://www.blogjava.net/aldmd/archive/2007/03/31/107297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts中关于用户权限限定的建议</title><link>http://www.blogjava.net/aldmd/archive/2007/02/26/100786.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Mon, 26 Feb 2007 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2007/02/26/100786.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/100786.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2007/02/26/100786.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/100786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/100786.html</trackback:ping><description><![CDATA[
		<p>关于web系统的权限限定问题，可能有很多的办法，我在这里说一下自己的一些小技巧，起到抛砖引玉的作用，忘各位指正：<br />系统中一个角色包含多个用户，角色和用户之间最好采用一对多，以免发生混乱；<br />自系统初起的时候，系统只有一个超级用户（例如root），有两个默认角色，即游客角色和注册用户角色；<br />超级用户可以在后续管理中添加角色，默认角色不能删除，其他角色的删除中如果这个角色下有用户，可以采取不允许删除或删除后这些用户的角色自动转为注册用户角色；<br />每个角色用户访问系统某些功能模块的权利，某个角色是否可以访问某个功能模块可以由超级用户修改，这里也包括默认角色所对应的权限模块；<br />角色与系统模块之间是多对多的关系，即一个角色可以访问多个模块，一个模块可能有多个角色访问；<br /><br />我们这里主要谈struts，一个模块包含多个action，action和模块是多对一的关系；<br />这样用户访问某个action时会映射到系统的某个模块，这是系统取出当前用户所在的角色，看看这个角色是否有访问此模块的权限，即可以实现struts中的权限设定；<br />这一过程主要包含以下几块：<br />1．系统的各个模块在系统开发完毕后就会形成，这些模块信息保存在持久媒体中；<br />2．struts-config.xml中，每个action的配置中都有一个role属性，这个属性中填写一个模块的名称，这样就建立起了action与模块的多对一关系；<br />3．用户、角色、模块之间的映射关系通过数据库表间的映射，这里就不再多说；<br />4．扩展struts中的requestProcessor类（注意如果使用tiles框架，需要继承另外一个tiles专用的类），复写其中的processorRole方法（其他方法也很有用，例如preprocess方法，可以设置提交的字符串都为UTF-8，也可以用户写一些系统的访问日志等等），在这个方法中可以取出当前action的模块名称和当前用户的角色，这样就可以实现对于用户的权限限定了。<br /><br />这样就可以实现权限限定了，这个方法的优点是即便是从某些地方找到下载或者访问某些重要功能的链接仍然可以拦截，缺点是每次访问都需要判定，但做好适当的缓存即可，如何做缓存因各系统而异；如果有特殊需要还可以限定ip，甚至一个session对应一个id，如果换了ip则session立即销毁，防止用户转贴了sessionid所假冒的用户。<br /><br />今天比较晕，很少写这么长的文章，大家先凑合看，有什么问题欢迎指出，我会尽快修正。<br /></p>
<img src ="http://www.blogjava.net/aldmd/aggbug/100786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2007-02-26 17:39 <a href="http://www.blogjava.net/aldmd/archive/2007/02/26/100786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于blogjava</title><link>http://www.blogjava.net/aldmd/archive/2007/02/02/97533.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Fri, 02 Feb 2007 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2007/02/02/97533.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/97533.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2007/02/02/97533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/97533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/97533.html</trackback:ping><description><![CDATA[
		<p>上午在写一篇随想的时候居然~~~，bolgjava当掉了，呵呵。</p>
<img src ="http://www.blogjava.net/aldmd/aggbug/97533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2007-02-02 14:29 <a href="http://www.blogjava.net/aldmd/archive/2007/02/02/97533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>