﻿<?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-dwys0343-文章分类-编码问题</title><link>http://www.blogjava.net/dwys0343/category/19455.html</link><description>技术整理</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:18:50 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:18:50 GMT</pubDate><ttl>60</ttl><item><title>Unicode字符编码分布表</title><link>http://www.blogjava.net/dwys0343/articles/98774.html</link><dc:creator>特兰克斯</dc:creator><author>特兰克斯</author><pubDate>Thu, 08 Feb 2007 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/dwys0343/articles/98774.html</guid><wfw:comment>http://www.blogjava.net/dwys0343/comments/98774.html</wfw:comment><comments>http://www.blogjava.net/dwys0343/articles/98774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dwys0343/comments/commentRss/98774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dwys0343/services/trackbacks/98774.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 欧洲字母																																																																										非洲文字																																																																										印度文字										...&nbsp;&nbsp;<a href='http://www.blogjava.net/dwys0343/articles/98774.html'>阅读全文</a><img src ="http://www.blogjava.net/dwys0343/aggbug/98774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dwys0343/" target="_blank">特兰克斯</a> 2007-02-08 14:47 <a href="http://www.blogjava.net/dwys0343/articles/98774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java-汉字问题深入谈</title><link>http://www.blogjava.net/dwys0343/articles/96586.html</link><dc:creator>特兰克斯</dc:creator><author>特兰克斯</author><pubDate>Mon, 29 Jan 2007 11:10:00 GMT</pubDate><guid>http://www.blogjava.net/dwys0343/articles/96586.html</guid><wfw:comment>http://www.blogjava.net/dwys0343/comments/96586.html</wfw:comment><comments>http://www.blogjava.net/dwys0343/articles/96586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dwys0343/comments/commentRss/96586.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dwys0343/services/trackbacks/96586.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">一、主题：关于java的中文问题</font>
		<br />java的中文问题比较突出，主要表现在控制面板输出，jsp页面输出和数据库访问上。 <br />本文尽量避开字体问题，而只谈编码。通过本文，你可以了解java中文问题的由来，问题 <br />的解决方法，其中提了一下用jdbc访问数据库的方法。 <br /><br /><font color="#0000ff">二、问题描述： <br /></font>1）在中文w2000中文窗口编译和运行，用的是国际版的jdk，连接的是中文w2000下的cp936 <br />编码的sql server数据库： <br /><br />j:\exercise\demo\encode\helloworld&gt;make <br />created by xcompiler. philosoft all rights reserved. <br />wed may 30 02:54:45 cst 2001 <br /><br />j:\exercise\demo\encode\helloworld&gt;run <br />created by xrunner. philosoft all rights reserved. <br />wed may 30 02:51:33 cst 2001 <br />中文 <br />[b@7bc8b569 <br />[b@7b08b569 <br />[b@7860b569 <br />中文 <br />中文 <br />???? <br />中文 <br />中文 <br />???? <br />?? <br />?? <br />?? <br /><br />2）如果在中文w2000的西文窗口（编码为437）下编译，用java运行则由于无字体而无法正 <br />常显示，如果象上面一样在中文w2000的中文窗口运行，输出为： <br /><br />j:\exercise\demo\encode\helloworld&gt;run <br />created by xrunner. philosoft all rights reserved. <br />wed may 30 02:51:33 cst 2001 <br />???? <br />[b@7bc0b66a <br />[b@7b04b66a <br />[b@7818b66a <br />???? <br />???? <br />???? <br />???? <br />???? <br />???? <br />中文 <br />中文 <br />???? <br /><br /><font color="#0000ff">三）分析 <br /></font><br />1）出现有乱码（也就是？）。由于只出现？而没出现小方框，说明只是编码有问题，而不 <br />是字体问题。 在编码中，如果从一种字符集转换到别一种字符集，比较典型的是从gb2312 <br />转换到iso8859_1（即ascii），那么很多汉字（半个汉字）是无法映射到西文字符中去的 <br />，在这种情形下，系统就把这些字符用？代替。同样，也存在小字符集无法到大字符集的 <br />情况，具体原因这里就不详谈了。 <br /><br />2）出现了中文环境编译，中文环境运行时汉字显示有正确也有不正确的地方，同样，在西 <br />文环境下编译，在中文环境下运行时也出现类似情况。这是由于自动（默认）或手工（也 <br />就new string(bytes[,encode])和bytes getbytes([encode])）转码的结果。 <br /><br />2.1）在java源文件--&gt;javac--&gt;class--&gt;java--&gt;getbytes()--&gt;new string()--&gt;显示的过 <br />程中，每一步都有编码的转换过程，这个过程总是存在的，只是有的时候用默认的参数进 <br />行。下面我们一步一步分析为什么出现上面的情形。 <br /><br />2.2）这里是源代码： <br /><br />helloworld.java: <br />------------------------ <br />public class helloworld <br />{ <br />public static void main(string[] argv){ <br />try{ <br />system.out.println("中文");//1 <br />system.out.println("中文".getbytes());//2 <br />system.out.println("中文".getbytes("gb2312"));//3 <br />system.out.println("中文".getbytes("iso8859_1"));//4 <br /><br />system.out.println(new string("中文".getbytes()));//5 <br />system.out.println(new string("中文".getbytes(),"gb2312"));//6 <br />system.out.println(new string("中文".getbytes(),"iso8859_1"));//7 <br /><br />system.out.println(new string("中文".getbytes("gb2312")));//8 <br />system.out.println(new string("中文".getbytes("gb2312"),"gb2312"));//9 <br />system.out.println(new <br /><br />string("中文".getbytes("gb2312"),"iso8859_1"));//10 <br /><br />system.out.println(new string("中文".getbytes("iso8859_1")));//11 <br />system.out.println(new <br /><br />string("中文".getbytes("iso8859_1"),"gb2312"));//12 <br />system.out.println(new <br /><br />string("中文".getbytes("iso8859_1"),"iso8859_1"));//13 <br />} <br />catch(exception e){ <br />e.printstacktrace(); <br />} <br />} <br />} <br /><br />为了方便起见，在每个转换的后面加了操作序号，分别为1,2,...,13。 <br /><br />2.3）需要说明的是，javac是以系统默认编码读入源文件，然后按unicode进行编码的。在 <br />java运行的时候，java也是采用unicode编码的，并且默认输入和输出的都是操作系统的默 <br />认编码，也就是说在new string(bytes[,encode])中，系统认为输入的是编码为encode的 <br />字节流，换句话说，如果按encode来翻译bytes才能得到正确的结果，这个结果最后要在ja <br />va中保存，它还是要从这个encode转换成unicode，也就是说有bytes--&gt;encode字符--&gt;uni <br />code字符的转换；而在string.getbytes([encode])中，系统要做一个unicode字符--&gt;enco <br />de字符--&gt;bytes的转换。 <br /><br />在这个例子中，除那个英文窗口编码的时候除外，其实情形下默认编码都是gbk（在本例中 <br />，我们暂且把gbk和gb2312等同看待）。 <br /><br />2.4）由于在未指明在上面的两个用代码实现的转换中，如果未指定encode，系统将采用默 <br />认的编码（这里为gbk），我们认为上面的5,6,7和8,9,10是一样的，8和9、11和12也是一 <br />样的，所以我们在讨论中将只讨论1,9,10,12,13。其中的2,3,4只是用于测试，不在我们的 <br />讨论范围之内。 <br /><br />2.5）下面我们来跟踪程序中的“中”字的转换历程，我们先说在中文窗口下作的编译和运 <br />行过程，注意在下面的字母下标中，我有意识地使用了一些数字，以表示相同，相异还是 <br />相关2.5.1)我们先以上面的13个代码段中的的代码9为例： <br /><br />步骤 内容 地点 说明 <br />01： c1 helloworld.java c1泛指一个gbk字符 <br />02： u1 javac读取 u1泛指一个unicode字符 <br />03： c1 getbytes()第一步 java先和操作系统交流 <br />04： b1,b2 getbytes()第二步 然后返回字节数组 <br />05： c1 new string()第一步 java先和操作系统交流 <br />06： u1 new string()第二步 然后返回字符 <br />07： c1 println(string) 能显示“中”字，内容和原来的相同 <br /><br />2.5.2）然后再以代码段10为例，我们注意到只是： <br /><br />步骤 内容 地点 说明 <br />01： c1 helloworld.java c1泛指一个gbk字符 <br />02： u1 javac读取 u1泛指一个unicode字符 <br />03： c1 getbytes()第一步 java先和操作系统交流 <br />04： b1,b2 getbytes()第二步 然后返回字节数组 <br />05： c3,c4 new string()第一步 java先和操作系统交流，这时解析错误 <br />06： u5,u6 new string()第二步 然后返回字符 <br />07： c3,c4 println(string) 由于中字给分成了两半，在iso8859_1中刚好也没有字符 <br /><br />能映射上，所以显示为“??”。在上面的示例中， <br />“中文”两个字就显示为“？？？？” <br />2.5.3）在完全中文模式下的其它情形类似，我就不多说了 <br /><br />2.6）我们接着看为什么在西文dos窗口下编译出来的类在中文窗口下也出现类似情形，特 <br />别是为什么居然有的情形下还能正确显示汉字。 <br /><br />2.6.1）我们还是先以代码段9为例： <br /><br />步骤 内容 地点 说明 <br />01： c1c2 helloworld.java c1c2分别泛指一个iso8859_1字符，“中”字被拆开 <br />02： u3u4 javac读取 u1u2泛指一个unicode字符 <br />03： c5c6 getbytes()第一步 java先和操作系统交流，这时解析错误 <br />04： b5b6b7b8 getbytes()第二步 然后返回字节数组 <br />05： c5c6 new string()第一步 java先和操作系统交流 <br />06： u3u4 new string()第二步 然后返回字符 <br />07： c5c6 println(string) 虽然同是两个字符，但已不是最初的“两个iso8859_1字 <br /><br />符”，而是“两个bgk字符”，“中”显示成了“？？” <br />而“中文”就显示成了“？？？？” <br /><br />2.6.2）下面我们以代码段12为例，因为它能正确显示汉字 <br /><br />步骤 内容 地点 说明 <br /><br />01： c1c2 helloworld.java c1c2分别泛指一个iso8859_1字符，“中”字被拆开 <br />02： u3u4 javac读取 u1u2泛指一个unicode字符 <br />03： c1c2 getbytes()第一步 java先和操作系统交流（注意还是正确的哦！） <br />04： b5b6 getbytes()第二步 然后返回字节数组（这是很关键的一步！） <br />05： c12 new string()第一步 java先和操作系统交流（这是更关键的一步，java已经知 <br />道b5b6要解析成一个汉字！） <br />06： u7 new string()第二步 然后返回字符（真是一个项两！u7包含了u3u4的信息） <br />07： c12 println(string) 这就原来的“中”字，很委屈被javac冤枉了一回，不过被程 <br />序员拨乱反正了一下！当然，“中文”两个字都能正确显示了！ <br /><br />3）那为什么有的时候用jdbc的 <br />new string(recordset.getbytes(int)[,encode]) <br />recordset.getsting(int) <br />recordset.setbytes(string.getbytes([encode])) <br />和 <br />recordset.setstring(string) <br />的时候会出现乱码了呢？ <br /><br />其实问题就出现在编写jdbc的的也考虑了编码问题，它从数据库读取数据后，可能自作主 <br />张做了一个从gb2312（默认编码）到unicode的转换，我的这个weblogic for sql server <br />的jdbc driver就是这样的，当我读字串的时候，发出读到的不是正确的汉字，可恨的是我 <br />却可以直接写汉字字串，这让人多少有点难以接受！ <br />也就是说，我们不得不在读或写的时候进行转码，尽管这个转码有的时候不是那么明显， <br />这是因为我们使用了默认的编码进行转码。jdbc driver所做的操作，我们只有进入到源代 <br />码内部才能清楚，不是吗？ <br /><br /><br /><img height="1" src="http://www.z6688.com/down_info.asp?id=35119" width="1" border="0" /><br />文章整理：西部数码--专业提供<a href="http://www.west263.com/services/domain/">域名注册</a>、<a href="http://www.west263.com/">虚拟主机</a>服务<br /><a href="http://www.west263.com/">http://www.west263.com</a><br />以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息，谢谢!<img src ="http://www.blogjava.net/dwys0343/aggbug/96586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dwys0343/" target="_blank">特兰克斯</a> 2007-01-29 19:10 <a href="http://www.blogjava.net/dwys0343/articles/96586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>