乱码之一 eclipse console 和 xp console 乱码 全程详解(一)

在java开发中,如果项目中有中文,乱码的问题会经常的遇到。而这个问题,并且经常困扰大家。最近元旦,manager都休假,我就花了点点时间,去仔细的研究了一下,乱码的问题以及根源。
先说,我们常用的编码格式(charset):

1)iso8859-1,这个是一种单字节的编码,也就是其利用了ascii码以及其他没有被利用到的0-255之间的其他的字节,来对数据进行编码

2)gbk 汉字内码扩展规范,兼容gb2312是一种双字节编码。即对于每个字符,都用两个字节来表示。

3)utf-8  是UNICODE的一种变长字符编码又称万国码。

具体以上三个之间的转码关系,或者是一个汉字对应的三个之间的编码,可以搜索一下,资料很多。我下面主要说一下乱码的原因。

所有的数据的保存,以及传输都是二进制数据,但是这种二进制与人类可识别的各种文字符号之间,并不是一 一对应的,这取决于所采用的编码,即把一个可见字符,通过某种编码,以一个或者多个字节来替代,并进行保存和传输。我们通常在notepad或者ue里面看到的,不论是中文或者是英文,都只是将保存在硬盘的二进制数据,通过某种已知的或者已经确定的编码进行解码,然后输出到显示器,方便我们自己查看。


文字符号--(encode)-->binary--(decode)-->文字符号.当encode与decode所采用的charset不一致的时候就会出现乱码问题。


针对于java开发,所见的文件有两种,java  code source file和java class file。

先说java code source file的编码问题,通常我们直接用记事本,写一个HelloWorld.java文件,然后保存,它默认用的是系统的编码,比如GBK.
然后通过javac HelloWorld.java编译得到class file.

那么其中第一个乱码产生之一就是HelloWorld.java的编码.

public class HelloWorld{    
    public static void main(String[]args){
        String chineseChar="汉";
        System.out.println(chineseChar);
        }
}


将其用notepad保存为默认格式,然后用十六进制的软件或者ue打开(关闭所有的格式自动转换和检测),如果你能够在HelloWorld.java的十六进制格式中找到BA BA那么这个source file以GBK或者兼容的格式保存的,而如果是E6 B1 89那么则是用UTF-8保存的(“汉”的GBK编码为BABA,UTF-8编码为E6 B1 89),此时我们如果要准确的编译为class文件,则要指定源文件的编码格式

            即javac -encoding GBK  HelloWorld.java (如果看到的是BA BA)或者javac -encoding UTF-8  HelloWorld.java(看到的是E6 B1 89),那么我们再执行java HelloWorld即可在控制台看到输出的“汉”字。

当然,这个指的是你的电脑的环境是默认charset如果为GBK(及其兼容模式),才会正常输出,否则,将仍然会出现乱码。(具体原因稍后解释).


小结一:

        a)上面如果是UTF-8的文件,用javac -encoding GBK  HelloWorld.java编译或者反过来,都会出错,这个就是我们经常在eclipse遇到的,在某个class因为有中文的comments而不能保存的错误。

        b)在eclipse中不论你对项目指定了UTF-8或者是GBK,那么它对应的源文件以及在编译时用的charset默认都是一样的,所以不会现编译时的乱码或者不能保存的问题,一般比较多的出现此类问题是当你导入一个不是你当前的eclipse环境创建的项目的时候,才会出现(如何避免,后面也会提到)。


转载于:https://my.oschina.net/u/186769/blog/658013

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值