笑着 胖胖兰原创,转载请注明。
http://blog.csdn.net/bluesmile979/archive/2008/10/28/3168400.aspx
看到了一些朋友说没有代码说的不是很清楚。在这里说声抱歉。笑着的工作本身也是很忙的,业余时间也不是很多,爱好又比较多,花到这里的时间就不多了。可能没有那么多时间去写到那么详细。只是因为怀念一些刚参加工作时候的人和事才能坚持写一点东西,只能做一个摘要性的介绍。
这篇文章中要讨论的是关于乱码的问题
1. 乱码问题的由来。
因为计算机最初是由人家欧美人发明出来的。很多技术也都是人家欧美人创造的。在互联网还没有像几天这么发达的年代,大家并没有给与国际化足够的重视,我开发发明的东西,那么自然满足我的需求就OK了,所以最初计算机以及大多数的软件都是只支持单字节的英文字符的,到了后来,大家都要用计算机,都要用你的软件,为了满足各国各民族的语言(包括我们汉语),所以出现了针对各国各民族的双字节的语言编码。比如GBK,比如SHIFT_JIS。再后来,大家希望自己的作出来的软件产品可以在各个国家通用而不需要修改,就出现了支持所有国家语言的UNICODE编码。
但是从操作系统开始一直到客户终端,我们生产的产品毕竟只是其中的一块儿,一个环节。这其中需要一些编码的转换。任何一个环节编码转换错误都会造成乱码。
2. 关于编码转换。
虽然实际上并非如此,但是我们可以简单的如下的理解编码转换的问题。
首先,每一种编码本身都维护一张Key-Value的字符关系映射网,恩,我们可以称呼这个字符关系映射网为一个Map。其中Key相当于一个索引,1,2,3,4,5这样的索引,Value相当于具体需要被显示出来的字符。在程序中,我们实际传递的是1,2,3,4,5这样的索引,是Key,然后接收到Key的地方(程序),根据Key,也就是索引,在我们指定的编码的Map里面查找这个索引对应的需要被显示出来的字符形状。当我们没有明确制定的时候,就会采用软件或者操作系统自身设定好的默认的编码。当这些默认的编码不匹配的时候,就会出现乱码。
比如,一个字符,在SHIFT_JIS里面的索引是1,把这个索引传递给另外一个程序的时候,这个程序默认使用GBK编码,那么程序中会检索GBK Map中索引为1的位置的字符并显示出来,结果发现GBK Map中索引为1的位置没有对应的字符,或者对应的字符在字体库中没有对应的显示图形,就会显示乱码出来。
3. 一些常见的编码
*ISO-8859-1
*UTF-8,同UNICODE编码
*GB2312,GBK,MS936,SHIFT_JIS,WINDOWS-31J,MS932 同ANSI
4.一些常见的问题。
通过以上内容,我们可以了解乱码问题一般来说都是出在软件接受输入,向外输出的地方。下面简单看看一些常见的问题。
1. 通过输入输出流进行输入输出。比如通过CMD命令行,比如通过文件,这些都是需要通过输入输出流来进行数据交互的,所以我们需要考虑对输入输出流进行编码设定。比如:
BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
BufferedWriter stdout =
new BufferedWriter(new OutputStreamWriter(System.out,"UTF-8"));
这里强调一下关于文件流的输入输出,设定的编码要与文件本身的保存编码保持一致。默认情况下文件保存都是采用ANSI编码,也就是系统的默认编码(中文系统就是GBK,日文系统就是SHIFT_JIS),默认情况下不特别进行编码设定是不会有问题的。但是,当我们保存文件的时候选择了UTF-8编码(文件另存为的时候就可以看到),那么你的文件输入流就需要进行对应的设定。
2. 程序本身包含中文,日文相关文字。这个时候在编译的时候需要指定编码。
javac -encoding utf-8 xxxx.java
3. 网页方面
一般Java的web容器都是使用的ISO-8859-1编码,IE浏览器传输的都是UTF-8编码。
网页乱码需要作如下设定:
<%@page contentType="text/html; charset=utf-8"%>
<%request.setCharacterEncoding("utf-8");%>
同时需要把文件本身保存为utf-8编码。
4. 数据库连结
每个数据库情况不同。比如mysql可以通过如下方法。
jdbc:mysql://localhost/jive?useUnicode=true&characterEncoding=utf-8
oracle和sqlserver好像是在服务器段直接设定。
如果数据库不支持utf-8编码的话,笑着采用的是一个折衷的办法,存入数据库之前把字符全部转码成英文字符,取出来的时候再转回来。一般数据库都不会有这个问题。笑着用access数据库写东西玩的时候遇到过这种问题。
5. SWING控件的显示。
Java中Swing控件本身采用的就是UTF-8编码。如果有乱码问题的话,这不是编码问题造成的,而是系统采用的显示UTF-8编码的字体有问题,设定一下显示字体就可以了。比如Word文档采用的就是UTF-8编码,你选择不同的字体就会有不同的显示效果。
private void setUIManager(){
Font pfont = new Font("Courier", Font.PLAIN, 12);
//Font pfont = new Font("SimSun", Font.PLAIN, 12);
UIManager.put("togglebutton.font", pfont);
}
6.