请高手进来指点一下java默认平台编码问题

fmxlj 2012-11-25 01:47:39
本人最近看到网上流传的张孝祥老师的一个程序,如下:
该程序第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里面到底是什么意思?是不是像张孝祥视频教学中说的那样是修改平台默认编码用的
...全文
317 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
笑莫问 2012-12-29
  • 打赏
  • 举报
回复
还在跑jdk1.4..........
dongguawj 2012-12-29
  • 打赏
  • 举报
回复
我的文档wwwwwwwwwwww为
dongguawj 2012-12-29
  • 打赏
  • 举报
回复
原来是这样的啊。。。。几好,几好。。。
fmxlj 2012-11-28
  • 打赏
  • 举报
回复
谢谢各位.答案我终于找到了.和大家分享一下 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=6277100 http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding
  • 打赏
  • 举报
回复
引用
#6
有个文章你去看下~ 我觉得讲的挺清楚 http://www.24xuexi.com/w/2011-04-25/88807.html
fmxlj 2012-11-26
  • 打赏
  • 举报
回复
引用 5 楼 hbwhwang 的回复:
第二问:在1.6以上平台 byte[] buf=strChina.getBytes(Charset.forName("iso8859-1")); 即可得到效果
我想通过 代码第6行达到更改默认编码,采用getBytes()函数设置编码这个我也知道.
fmxlj 2012-11-26
  • 打赏
  • 举报
回复
引用 1 楼 cdx900605 的回复:
兄弟~ 首先我也不是高手只能说我们互相探讨~ 第一 对于前两个问题我就不是很清楚~ 我只是猜测一下~ 1.4.2你的各项设置是否对了~? 第二 最后一个问题 file.encoding是编码方案~ 再不做修改的时候 javac默认-file.encoding取的当前系统的默认文件编码方案,如果你做了修改那就不用说了是你的方案~
这个与设置无关,张孝祥老师课视频上也是采用1.4.1下的结果是图3.我又测试了一下,其他版本下的都是图2结果.现在关心的是file.encoding到底能够做什么
hbwhwang 2012-11-25
  • 打赏
  • 举报
回复
第二问:在1.6以上平台 byte[] buf=strChina.getBytes(Charset.forName("iso8859-1")); 即可得到效果
一心念佛 2012-11-25
  • 打赏
  • 举报
回复
file.encoding 这个属性修改的是这个文件的编码方案,具体点就是这个文件保存时用哪种编码保存。我们知道文件保存时使用二进制保存在硬盘上,file.encoding就是具体使用哪种编码的方式。 而System.out.write(int b) 这个方法采用平台默认编码方式,所有字符都使用平台的默认字符编码转换为字节,
zhaoming262350 2012-11-25
  • 打赏
  • 举报
回复
这是在jdk1.7下运行的结果:
这与JDK的版本有关系:
zhaoming262350 2012-11-25
  • 打赏
  • 举报
回复
用jdk1.5以后的版本,jdk1.5以后的版本有了新特性
  • 打赏
  • 举报
回复
兄弟~ 首先我也不是高手只能说我们互相探讨~ 第一 对于前两个问题我就不是很清楚~ 我只是猜测一下~ 1.4.2你的各项设置是否对了~? 第二 最后一个问题 file.encoding是编码方案~ 再不做修改的时候 javac默认-file.encoding取的当前系统的默认文件编码方案,如果你做了修改那就不用说了是你的方案~

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧