本人最近看到网上流传的张孝祥老师的一个程序,如下:
该程序第6行将平台默认编码修改为iso8859-1,在第10行调用getBytes()将unicode字符串strChina编码为平台默认编码即iso8859-1.
按道理,程序11-12行应该输出字符串StrChina的iso8859-1编码,但我测试的时候,并没有出现预期的结果,而是还是按GB2312编码输出,如图2,说明在第6行的设置没有生效.但是张孝祥老师的视频显示里却生效了的,输出了iso8859-1,如图3.
于是通过测试,我在jdk1.4.1及以下版本下运行结果是图3,而在jdk1.4.2及以上是图2结果.图1:源代码
图2,jdk1.4.2及以上版本运行结果
图3:jdk1.4.1及以下版本运行结果
请高手为我解答一下:
(1)为什么在jdk1.4.1及以下版本可以通过file.encoding属性修改平台默认编码,而以上版本不行,两者的实现机制区别在哪里?
(2)如果在jdk1.4.2及以上版本修改平台默认编码,即得到图3的结果,应该怎么做?
(3)file.encoding在java里面到底是什么意思?是不是像张孝祥视频教学中说的那样是修改平台默认编码用的

解决方案 »

  1.   

    兄弟~  首先我也不是高手只能说我们互相探讨~ 
    第一 对于前两个问题我就不是很清楚~  我只是猜测一下~  1.4.2你的各项设置是否对了~?  
    第二  最后一个问题  file.encoding是编码方案~  再不做修改的时候 javac默认-file.encoding取的当前系统的默认文件编码方案,如果你做了修改那就不用说了是你的方案~ 
      

  2.   

    用jdk1.5以后的版本,jdk1.5以后的版本有了新特性
      

  3.   

    这是在jdk1.7下运行的结果:
    这与JDK的版本有关系:
      

  4.   

    file.encoding 这个属性修改的是这个文件的编码方案,具体点就是这个文件保存时用哪种编码保存。我们知道文件保存时使用二进制保存在硬盘上,file.encoding就是具体使用哪种编码的方式。而System.out.write(int b) 这个方法采用平台默认编码方式,所有字符都使用平台的默认字符编码转换为字节,
      

  5.   

    第二问:在1.6以上平台
    byte[] buf=strChina.getBytes(Charset.forName("iso8859-1"));
    即可得到效果
      

  6.   


    这个与设置无关,张孝祥老师课视频上也是采用1.4.1下的结果是图3.我又测试了一下,其他版本下的都是图2结果.现在关心的是file.encoding到底能够做什么
      

  7.   

    我想通过 代码第6行达到更改默认编码,采用getBytes()函数设置编码这个我也知道.
      

  8.   

    有个文章你去看下~  我觉得讲的挺清楚
    http://www.24xuexi.com/w/2011-04-25/88807.html
      

  9.   

    谢谢各位.答案我终于找到了.和大家分享一下
    http://bugs.sun.com/view_bug.do?bug_id=4163515
    This is not a bug.  The "file.encoding" property is not required by the J2SE
    platform specification; it's an internal detail of Sun's implementations and
    should not be examined or modified by user code.  It's also intended to be
    read-only; it's technically impossible to support the setting of this property
    to arbitrary values on the command line or at any other time during program
    execution.The preferred way to change the default encoding used by the VM and the runtime
    system is to change the locale of the underlying platform before starting your
    Java program.官网意思是说 file.encoding 是java内部实现用的.可以看作是只读的,不能作为更改平台缺省编码的依据和方法所以在各种平台上的内部实现不一样.仅仅在jdk1.4.1下,可以通过file.encoding更改平台缺省编码.其它版本都不行.所以张孝祥老师的课件的运行结果仅仅是个巧合.setProperties()不能用作程序中修改平台编码的依据.相关的解答还有:
    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6277100http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding