﻿<?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</title><link>http://www.blogjava.net/aldmd/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 14:56:20 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 14:56:20 GMT</pubDate><ttl>60</ttl><item><title>自定义Apache日志格式</title><link>http://www.blogjava.net/aldmd/archive/2011/05/05/349584.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Thu, 05 May 2011 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2011/05/05/349584.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/349584.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2011/05/05/349584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/349584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/349584.html</trackback:ping><description><![CDATA[在Apache的httpd.conf文件中，通过LogFormat和CustomLog指令可以实现自定义日志文件格式和内容的目的。<br />
LogFormat和CustomLog的格式化参数是一个字符串，这个字符串会在每次请求发生的时候，被记录到日志文件中去。它可以包含被原样写入日志的文本字符串以及控制字符如：&#8220;\t&#8221;、&#8220;\n&#8221;， 其他的特殊字符均可通过反斜杠转义。请求本身的情况将通过在格式字符串中放置各种&#8220;%&#8221;转义的方式来记录。<br />
下表列出了Apache日志格式字符串的含义<br />
%% &nbsp;&nbsp;&nbsp; 百分号(Apache2.0.44或更高的版本)<br />
%a &nbsp;&nbsp;&nbsp; 远端IP地址<br />
%A &nbsp;&nbsp;&nbsp; 本机IP地址<br />
%B &nbsp;&nbsp;&nbsp; 除HTTP头以外传送的字节数<br />
%b &nbsp;&nbsp;&nbsp; 以CLF格式显示的除HTTP头以外传送的字节数，也就是当没有字节传送时显示&#8217;-&#8216;而不是0。<br />
%{Foobar}C &nbsp;&nbsp;&nbsp; 在请求中传送给服务端的cookieFoobar的内容。<br />
%D &nbsp;&nbsp;&nbsp; 服务器处理本请求所用时间，以微为单位。<br />
%{FOOBAR}e &nbsp;&nbsp;&nbsp; 环境变量FOOBAR的值<br />
%f &nbsp;&nbsp;&nbsp; 文件名<br />
%h &nbsp;&nbsp;&nbsp; 远端主机<br />
%H &nbsp;&nbsp;&nbsp; 请求使用的协议<br />
%{Foobar}i &nbsp;&nbsp;&nbsp; 发送到服务器的请求头Foobar:的内容。<br />
%l &nbsp;&nbsp;&nbsp; 远端登录名(由identd而来，如果支持的话)，除非IdentityCheck设为&#8221;On&#8220;，否则将得到一个&#8221;-&#8221;。<br />
%m &nbsp;&nbsp;&nbsp; 请求的方法<br />
%{Foobar}n &nbsp;&nbsp;&nbsp; 来自另一个模块的注解Foobar的内容。<br />
%{Foobar}o &nbsp;&nbsp;&nbsp; 应答头Foobar:的内容。<br />
%p &nbsp;&nbsp;&nbsp; 服务器服务于该请求的标准端口。<br />
%P &nbsp;&nbsp;&nbsp; 为本请求提供服务的子进程的PID。<br />
%{format}P &nbsp;&nbsp;&nbsp; 服务于该请求的PID或TID(线程ID)，format的取值范围为：pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本)<br />
%q &nbsp;&nbsp;&nbsp; 查询字符串(若存在则由一个&#8221;?&#8220;引导，否则返回空串)<br />
%r &nbsp;&nbsp;&nbsp; 请求的第一行<br />
%s &nbsp;&nbsp;&nbsp; 状态。对于内部重定向的请求，这个状态指的是原始请求的状态，—%&gt;s则指的是最后请求的状态。<br />
%t &nbsp;&nbsp;&nbsp; 时间，用普通日志时间格式(标准英语格式)<br />
%{format}t &nbsp;&nbsp;&nbsp; 时间，用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式)<br />
%T &nbsp;&nbsp;&nbsp; 处理完请求所花时间，以秒为单位。<br />
%u &nbsp;&nbsp;&nbsp; 远程用户名(根据验证信息而来；如果返回status(%s)为401，可能是假的)<br />
%U &nbsp;&nbsp;&nbsp; 请求的URL路径，不包含查询字符串。<br />
%v &nbsp;&nbsp;&nbsp; 对该请求提供服务的标准ServerName。<br />
%V &nbsp;&nbsp;&nbsp; 根据UseCanonicalName指令设定的服务器名称。<br />
%X &nbsp;&nbsp;&nbsp; 请求完成时的连接状态：<br />
X= &nbsp;&nbsp;&nbsp; 连接在应答完成前中断。<br />
+= &nbsp;&nbsp;&nbsp; 应答传送完后继续保持连接。<br />
-= &nbsp;&nbsp;&nbsp; 应答传送完后关闭连接。<br />
(在1.3以后的版本中，这个指令是%c，但这样就和过去的SSL语法：%{var}c冲突了)<br />
%I &nbsp;&nbsp;&nbsp; 接收的字节数，包括请求头的数据，并且不能为零。要使用这个指令你必须启用mod_logio模块。<br />
%O &nbsp;&nbsp;&nbsp; 发送的字节数，包括请求头的数据，并且不能为零。要使用这个指令你必须启用mod_logio模块。<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 一些常见的格式串：<br />
&nbsp;&nbsp;&nbsp; 通用日志格式(CLF)<br />
&nbsp;&nbsp;&nbsp; &#8220;%h %l %u %t \&#8221;%r\&#8221; %&gt;s %b&#8221;<br />
&nbsp;&nbsp;&nbsp; 带虚拟主机的通用日志格式<br />
&nbsp;&nbsp;&nbsp; &#8220;%v %h %l %u %t \&#8221;%r\&#8221; %&gt;s %b&#8221;<br />
&nbsp;&nbsp;&nbsp; NCSA扩展/组合日志格式<br />
&nbsp;&nbsp;&nbsp; &#8220;%h %l %u %t \&#8221;%r\&#8221; %&gt;s %b \&#8221;%{Referer}i\&#8221; \&#8221;%{User-agent}i\&#8221;"<br />
&nbsp;&nbsp;&nbsp; Referer日志格式<br />
&nbsp;&nbsp;&nbsp; &#8220;%{Referer}i -&gt; %U&#8221;<br />
&nbsp;&nbsp;&nbsp; Agent(Browser)日志格式<br />
&nbsp;&nbsp;&nbsp; &#8220;%{User-agent}i&#8221;<br />
<img src ="http://www.blogjava.net/aldmd/aggbug/349584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2011-05-05 13:22 <a href="http://www.blogjava.net/aldmd/archive/2011/05/05/349584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]freebsd下安装rz,sz上传下载工具(rzsz)</title><link>http://www.blogjava.net/aldmd/archive/2011/04/22/348804.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Fri, 22 Apr 2011 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2011/04/22/348804.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/348804.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2011/04/22/348804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/348804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/348804.html</trackback:ping><description><![CDATA[<p>安装包下载：<br />
<a style="color: #0066cc; text-decoration: none;" href="http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz">http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz</a></p>
<p>&lt;coolcode linenum=&#8221;off&#8221;&gt;<br />
tar -xzvf rzsz-3.48.tar.gz</p>
<p>cd src<br />
&lt;/coolcode&gt;</p>
<p>修改Makefile第四行OFLAG= -O 为 OFLAG= -O -DREGISTERED<br />
否则，编译后，在上传下载完成都会提示：</p>
<p>&lt;coolcode linenum=&#8221;off&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **** UNREGISTERED COPY *****<br />
Please read the License Agreement in rz.doc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/coolcode&gt;</p>
<p>&lt;coolcode linenum=&#8221;off&#8221;&gt;<br />
xok# make posix<br />
cc -O2 -fno-strict-aliasing -pipe&nbsp;&nbsp; -O -DREGISTERED -DPOSIX -DMD=2 rz.c -o rz<br />
size rz<br />
&nbsp;&nbsp; text&nbsp;&nbsp;&nbsp; data&nbsp;&nbsp;&nbsp;&nbsp; bss&nbsp;&nbsp;&nbsp;&nbsp; dec&nbsp;&nbsp;&nbsp;&nbsp; hex filename<br />
&nbsp; 29093&nbsp;&nbsp;&nbsp;&nbsp; 640&nbsp;&nbsp;&nbsp; 6328&nbsp;&nbsp; 36061&nbsp;&nbsp;&nbsp; 8cdd rz<br />
rm -f rb rx rc<br />
ln rz rb<br />
ln rz rx<br />
ln rz rc<br />
cc -O2 -fno-strict-aliasing -pipe&nbsp;&nbsp; -O -DREGISTERED -DPOSIX sz.c -o sz<br />
size sz<br />
&nbsp;&nbsp; text&nbsp;&nbsp;&nbsp; data&nbsp;&nbsp;&nbsp;&nbsp; bss&nbsp;&nbsp;&nbsp;&nbsp; dec&nbsp;&nbsp;&nbsp;&nbsp; hex filename<br />
&nbsp; 34632&nbsp;&nbsp;&nbsp;&nbsp; 704&nbsp;&nbsp; 38828&nbsp;&nbsp; 74164&nbsp;&nbsp; 121b4 sz<br />
rm -f sb sx zcommand zcommandi<br />
ln sz sb<br />
ln sz sx<br />
ln sz zcommand<br />
ln sz zcommandi<br />
cp rz sz /usr/sbin/<br />
&lt;/coolcode&gt;<br />
安装OK。</p>
<p>1.安装后，可以把sz 、 rz 复制到 /usr/local/bin 下</p>
<p>2.使用时如果遇到类似错误，</p>
<p>-bash-3.00$ sz sz.doc</p>
<p>/dev/pts/5: Permission denied</p>
<p>可以使用管理员修改&nbsp;/dev/pts/5 权限即可。</p>
<p>3.编译时，可能报 cc 找不到，修改Makefile 里的 cc 为gcc 即可</p>
<p>4.编译时，如果报 size 找不到，把&nbsp;/usr/ccs/bin/ &nbsp;加入 $PATH 既可</p>
<img src ="http://www.blogjava.net/aldmd/aggbug/348804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2011-04-22 15:40 <a href="http://www.blogjava.net/aldmd/archive/2011/04/22/348804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux系统手动安装rzsz 软件包</title><link>http://www.blogjava.net/aldmd/archive/2011/04/21/348694.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Thu, 21 Apr 2011 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2011/04/21/348694.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/348694.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2011/04/21/348694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/348694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/348694.html</trackback:ping><description><![CDATA[定制安装的linux可能没有把rzsz包安装到<span class="t_tag" href="tag.php?name=%CF%B5%CD%B3">系统</span>，这对用securecrt这样的<span class="t_tag" href="tag.php?name=win">win</span>dows<span class="t_tag" href="tag.php?name=%B9%A4%BE%DF">工具</span>传输<span class="t_tag" href="tag.php?name=%CE%C4%BC%FE">文件</span>特别不方便。为了使用这个方便的法门，可以手动安装之。<br />
1、下载<span class="t_tag" href="tag.php?name=%C8%ED%BC%FE">软件</span> rzsz-3.34.tar.gz。登录linux，用<span class="t_tag" href="tag.php?name=%C3%FC%C1%EE">命令</span><br />
2、解压 tar zxvf&nbsp;&nbsp;rzsz-3.34.tar.gz<br />
3、安装&nbsp;&nbsp;cd rzsz-3.34 ; make posix 。注意：这个软件安装与常规的GNU软件不同—没有configure(配置)及make install (安装过程)。先执行命令make,将给出下面的提示：<br />
<font face="宋体 ">：</font>
<table style="width: 98%" class="t_table" cellspacing="0" bgcolor="#f3f3f3">
    <tbody>
        <tr>
            <td width="528">[root@web1 rzsz]# <strong>make</strong><br />
            <font color="blue">Please study the #ifdef's in crctab.c, rbsb.c, rz.c and sz.c,</font><br />
            <font color="blue">make any necessary hacks for oddball or merged SYSV/BSD systems,</font><br />
            <font color="blue">then type 'make SYSTEM' where SYSTEM is one of:</font><br />
            <font color="blue"></font><font color="blue"><br />
            posix<br />
            POSIX compliant systems</font><br />
            <font color="blue"><br />
            linux<br />
            LINUX systems</font><br />
            <font color="blue"><br />
            odt<br />
            SCO Open Desktop</font><br />
            <font color="blue"><br />
            icc<br />
            SCO Open Desktop, Intel compiler</font><br />
            <font color="blue"><br />
            sysvr4<br />
            SYSTEM 5.4 Unix, SCO Open Desktop</font><br />
            <font color="blue"><br />
            sysvr3<br />
            SYSTEM 5.3 Unix with mkdir(2), COHERENT 4.2</font><br />
            <font color="blue"><br />
            sysv<br />
            SYSTEM 3/5 Unix</font><br />
            <font color="blue"><br />
            xenix<br />
            Xenix</font><br />
            <font color="blue"><br />
            x386<br />
            386 Xenix</font><br />
            <font color="blue"><br />
            bsd <br />
            Berkeley 4.x BSD, Ultrix, V7</font><br />
            <font color="blue"><br />
            tandy<br />
            Tandy 6000 Xenix</font><br />
            <font color="blue"><br />
            dnix<br />
            DIAB Dnix 5.2</font><br />
            <font color="blue"><br />
            dnix5r3 DIAB Dnix 5.3</font><br />
            <font color="blue"><br />
            amiga<br />
            3000UX running SVR4</font><br />
            <font color="blue"><br />
            POSIX<br />
            POSIX compliant systems (SCO Open Desktop, strict)</font><br />
            <font color="blue"></font><font color="blue"><br />
            doc<br />
            Format the man pages with nroff</font><br />
            </td>
        </tr>
    </tbody>
</table>
<br />
<font face="宋体 ">根据自己的系统选择</font>make<font face="宋体 ">的位置参数，一般情况下，选</font>posix<font face="宋体 ">或</font>linux<font face="宋体 ">就可以了。执行命令</font>make posix<font face="宋体 ">，我们从输出部分可以很清楚的看见这个步骤所进行的工作：</font><br />
<table class="t_table" cellspacing="0">
    <tbody>
        <tr>
            <td width="528">[root@web1 rzsz]# <br />
            <strong>make posix</strong><br />
            gcc -m486 -O2 -DLINUX -DHVM -DREGISTERED -s -DPOSIX -DMD=2 rz.c -o rz<br />
            size rz<br />
            <br />
            text<br />
            data<br />
            bss<br />
            dec<br />
            hex filename<br />
            <br />
            24847<br />
            636<br />
            10400<br />
            35883<br />
            8c2b rz<br />
            rm -f rb rx rc<br />
            ln rz rb<br />
            ln rz rx<br />
            ln rz rc<br />
            gcc -m486 -O2 -DLINUX -DHVM -DREGISTERED -s -DPOSIX sz.c -o sz<br />
            size sz<br />
            <br />
            text<br />
            data<br />
            bss<br />
            dec<br />
            hex filename<br />
            <br />
            29030<br />
            696<br />
            10208<br />
            39934<br />
            9bfe sz<br />
            rm -f sb sx zcommand zcommandi<br />
            ln sz sb<br />
            ln sz sx<br />
            ln sz zcommand<br />
            ln sz zcommandi<br />
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
4<font face="宋体 ">、为了方便使用这个工具，把相关文件复制到目录</font>/usr/bin<font face="宋体 ">下面。这里只需要拷贝</font>2<font face="宋体 ">个文件</font>rz<font face="宋体 ">及</font>sz,<font face="宋体 ">命令为：</font><strong>cp rz sz<br />
/usr/bin .</strong><br />
<br />
5<font face="宋体 ">、<span class="t_tag" href="tag.php?name=%C9%E8%D6%C3">设置</span><span class="t_tag" href="tag.php?name=%BB%B7%BE%B3">环境</span>变量</font> export <br />
RZSZLINE=/dev/modem<font face="宋体 ">。如果不设置这个环境变量，执行命令</font>rz<font face="宋体 ">的时候，总是会提示你&#8220;</font><font color="red">Warning: Missing environment variable 'RZSZLINE' (<span class="t_tag" href="tag.php?name=Linux">Linux</span>)</font><br />
<font color="red">rz ready. Type "sz file ..." to your modem program</font><font face="宋体 ">&#8221;。</font><br />
<br />
6<font face="宋体 ">、上传文件测试</font>rzsz<font face="宋体 ">。在</font>windows<font face="宋体 ">下通过</font>securecrt<font face="宋体 ">连接远程</font>linux<font face="宋体 "><span class="t_tag" href="tag.php?name=%B7%FE%CE%F1%C6%F7">服务器</span>，然后执行命令</font>rz<br />
<font face="宋体 ">回车后将弹出发送文件选择窗口：</font><br />
<font face="宋体 "><font face="宋体 ">点&#8220;添加&#8221;按钮，再选&#8220;确定&#8221;按钮就可把</font>windows<font face="宋体 ">主机上的文件通过</font>ssh<font face="宋体 "><span class="t_tag" href="tag.php?name=%D0%AD%D2%E9">协议</span>上传到</font>linux<font face="宋体 ">主机。通过&#8220;</font>Shifs<font face="宋体 ">&#8221;或&#8220;</font>Ctrl<font face="宋体 ">&#8221;键可以实现多个文件的传输。把</font>linux<font face="宋体 ">文件下载到</font>windows<font face="宋体 ">用命令</font>sz ,<font face="宋体 ">就很容易的把文件下载了；不过有一个地方得弄清楚：这些文件下载到什么位置了（</font>windows<font face="宋体 ">）</font>,<font face="宋体 ">通过对</font>securecrt<font face="宋体 ">的简单设置即可把文件下载到我们指定的目录。设置操作如下图所示：</font><br />
<font face="宋体 "><font face="宋体 ">点下载右侧那个按钮（只有</font>3<font face="宋体 ">个点）即可进行下一步设置。</font><br />
<br />
<font face="宋体 ">怎么把</font>windows<font face="宋体 ">下的目录上传到</font>linux<font face="宋体 ">呢？一个<span class="t_tag" href="tag.php?name=%B0%EC%B7%A8">办法</span>是在</font>windows<font face="宋体 ">下把目录打包压缩成一个文件在上传，另外一个是使用另外一个工具</font>ssh secure shell(<font face="宋体 ">可以在操作界面直接拖拽文件或目录</font>)<font face="宋体 ">。</font><br />
</font></font>
<img src ="http://www.blogjava.net/aldmd/aggbug/348694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2011-04-21 12:40 <a href="http://www.blogjava.net/aldmd/archive/2011/04/21/348694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux自动同步时间(转）</title><link>http://www.blogjava.net/aldmd/archive/2011/03/25/347032.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Fri, 25 Mar 2011 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2011/03/25/347032.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/347032.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2011/03/25/347032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/347032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/347032.html</trackback:ping><description><![CDATA[<div id="sina_keyword_ad_area2" class="articalContent  ">原文地址：http://blog.sina.com.cn/s/blog_6d3279350100lptj.html
<p><br />
在网上搜了好一会儿发现time.nist.gov这个时间服务器以经失效了<br />
<a href="mailto:root@OpenWrt">root@OpenWrt</a>:~# rdate -s time.nist.gov<br />
rdate: timeout connecting to time server</p>
<p>在<a href="http://youhuiba.net/2010/10/12/280.html">http://youhuiba.net/2010/10/12/280.html</a>这里发现一个可用的</p>
<p><a href="mailto:root@OpenWrt">root@OpenWrt</a>:~# rdate -s rdate.cpanel.net<br />
rdate: current time matches remote time<br />
现在把它添加到crontab中<br />
<a href="mailto:root@OpenWrt">root@OpenWrt</a>:~# crontab -e</p>
<p>00 19 * * *&nbsp;<wbr> rdate -s&nbsp;<wbr> rdate.cpanel.net<br />
具体的时间格式可以根据<a href="http://hi.baidu.com/mahaibao/blog/item/0286375582f2f7cbb645aed6.html">http://hi.baidu.com/mahaibao/blog/item/0286375582f2f7cbb645aed6<wbr>.html</a>中的介绍</p>
<p>就可以了~~~以后每天的晚上7点就可以自动的更新时间了</p>
</div>
<img src ="http://www.blogjava.net/aldmd/aggbug/347032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2011-03-25 18:00 <a href="http://www.blogjava.net/aldmd/archive/2011/03/25/347032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android缩小网页的问题</title><link>http://www.blogjava.net/aldmd/archive/2011/03/22/346770.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Tue, 22 Mar 2011 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2011/03/22/346770.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/346770.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2011/03/22/346770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/346770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/346770.html</trackback:ping><description><![CDATA[<p>如果android手机自带浏览器会缩小你的网页的话，在head里加入&lt;meta content="minimum-scale=1.0, width=device-width, maximum-scale=1.0, user-scalable=no" name="viewport" /&gt;就可以了</p>
<img src ="http://www.blogjava.net/aldmd/aggbug/346770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aldmd/" target="_blank">狮子心</a> 2011-03-22 18:12 <a href="http://www.blogjava.net/aldmd/archive/2011/03/22/346770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>Apache 安装过程中出错/usr/lib/libexpat.so: could not read symbols: File in wrong format的解决办法</title><link>http://www.blogjava.net/aldmd/archive/2010/11/30/339417.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Tue, 30 Nov 2010 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2010/11/30/339417.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/339417.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2010/11/30/339417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/339417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/339417.html</trackback:ping><description><![CDATA[<p>安装时报错，</p>
<p>/usr/lib/libexpat.so: could not read symbols: File in wrong format</p>
<p>解决办法，在参数中加入这句：</p>
<p>./configure --with-expat=builtin</p>
<img src ="http://www.blogjava.net/aldmd/aggbug/339417.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-11-30 17:06 <a href="http://www.blogjava.net/aldmd/archive/2010/11/30/339417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat访问日志配置</title><link>http://www.blogjava.net/aldmd/archive/2010/10/21/335777.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Thu, 21 Oct 2010 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2010/10/21/335777.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/335777.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2010/10/21/335777.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/335777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/335777.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; * %a - 远端IP地址 <br />
&nbsp;&nbsp;&nbsp; * %A - 本地IP地址 <br />
&nbsp;&nbsp;&nbsp; * %b - 发送的字节数，不包括HTTP头，如果为0，使用"－" <br />
&nbsp;&nbsp;&nbsp; * %B - 发送的字节数，不包括HTTP头 <br />
&nbsp;&nbsp;&nbsp; * %h - 远端主机名(如果resolveHost=false，远端的IP地址） <br />
&nbsp;&nbsp;&nbsp; * %H - 请求协议 <br />
&nbsp;&nbsp;&nbsp; * %l - 从identd返回的远端逻辑用户名（总是返回 '-'） <br />
&nbsp;&nbsp;&nbsp; * %m - 请求的方法（GET，POST，等） <br />
&nbsp;&nbsp;&nbsp; * %p - 收到请求的本地端口号 <br />
&nbsp;&nbsp;&nbsp; * %q - 查询字符串(如果存在，以 '?'开始) <br />
&nbsp;&nbsp;&nbsp; * %r - 请求的第一行，包含了请求的方法和URI <br />
&nbsp;&nbsp;&nbsp; * %s - 响应的状态码 <br />
&nbsp;&nbsp;&nbsp; * %S - 用户的session ID <br />
&nbsp;&nbsp;&nbsp; * %t - 日志和时间，使用通常的Log格式 <br />
&nbsp;&nbsp;&nbsp; * %u - 认证以后的远端用户（如果存在的话，否则为'-'） <br />
&nbsp;&nbsp;&nbsp; * %U - 请求的URI路径 <br />
&nbsp;&nbsp;&nbsp; * %v - 本地服务器的名称 <br />
&nbsp;&nbsp;&nbsp; * %D - 处理请求的时间，以毫秒为单位 <br />
&nbsp;&nbsp;&nbsp; * %T - 处理请求的时间，以秒为单位 <br />
<br />
<ul>
    <li><strong>%a</strong> - Remote IP address
    <li><strong>%A</strong> - Local IP address
    <li><strong>%b</strong> - Bytes sent, excluding HTTP headers, or '-' if zero
    <li><strong>%B</strong> - Bytes sent, excluding HTTP headers
    <li><strong>%h</strong> - Remote host name (or IP address if <code>resolveHosts</code> is false)
    <li><strong>%H</strong> - Request protocol
    <li><strong>%l</strong> - Remote logical username from identd (always returns '-')
    <li><strong>%m</strong> - Request method (GET, POST, etc.)
    <li><strong>%p</strong> - Local port on which this request was received
    <li><strong>%q</strong> - Query string (prepended with a '?' if it exists)
    <li><strong>%r</strong> - First line of the request (method and request URI)
    <li><strong>%s</strong> - HTTP status code of the response
    <li><strong>%S</strong> - User session ID
    <li><strong>%t</strong> - Date and time, in Common Log Format
    <li><strong>%u</strong> - Remote user that was authenticated (if any), else '-'
    <li><strong>%U</strong> - Requested URL path
    <li><strong>%v</strong> - Local server name
    <li><strong>%D</strong> - Time taken to process the request, in millis
    <li><strong>%T</strong> - Time taken to process the request, in seconds
    <li><strong>%I</strong> - current request thread name (can compare later with stacktraces) </li>
</ul>
<br />
<ul>
    <li><strong><code>%{xxx}i</code></strong> for incoming request headers
    <li><strong><code>%{xxx}o</code></strong> for outgoing response headers
    <li><strong><code>%{xxx}c</code></strong> for a specific request cookie
    <li><strong><code>%{xxx}r</code></strong> xxx is an attribute in the ServletRequest
    <li><strong><code>%{xxx}s</code></strong> xxx is an attribute in the HttpSession </li>
</ul>
<br />
<img src ="http://www.blogjava.net/aldmd/aggbug/335777.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-10-21 13:13 <a href="http://www.blogjava.net/aldmd/archive/2010/10/21/335777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache 安装过程中出错/usr/lib/libexpat.so: could not read symbols: File in wrong format的解决办法</title><link>http://www.blogjava.net/aldmd/archive/2010/06/02/322524.html</link><dc:creator>狮子心</dc:creator><author>狮子心</author><pubDate>Wed, 02 Jun 2010 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/aldmd/archive/2010/06/02/322524.html</guid><wfw:comment>http://www.blogjava.net/aldmd/comments/322524.html</wfw:comment><comments>http://www.blogjava.net/aldmd/archive/2010/06/02/322524.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/aldmd/comments/commentRss/322524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aldmd/services/trackbacks/322524.html</trackback:ping><description><![CDATA[<p>安装时报错，</p>
<p>/usr/lib/libexpat.so: could not read symbols: File in wrong format</p>
<p>解决办法，在参数中加入这句：</p>
<p>./configure --with-expat=builtin</p>
<img src ="http://www.blogjava.net/aldmd/aggbug/322524.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-06-02 10:39 <a href="http://www.blogjava.net/aldmd/archive/2010/06/02/322524.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></channel></rss>