返回信息流‘中’,gbk:6dd0, unicode:4e2d
假设在英文操作系统下(设其系统编码为iso-8859-1)连续存储了6d,d0两个字节,那么javac在读取的时候所有本地编码会被转为unicode编码,请问这两个字节转换后应该是什么?
这是一条镜像帖。来源:北邮人论坛 / java / #12160同步于 2009/11/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
问个关于编码的问题
timberwolf
2009/11/12镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
首先你要告诉你的java程序,当前的环境是iso-8859-1,或者读取的文件编码是iso-8859-1,然后在使用了流输入以后,在java内部,所有的这些信息都是以unicode的形式进行操作和存储的。
【 在 ericyosho 的大作中提到: 】
: 首先你要告诉你的java程序,当前的环境是iso-8859-1,或者读取的文件编码是iso-8859-1,然后在使用了流输入以后,在java内部,所有的这些信息都是以unicode的形式进行操作和存储的。
昨天上网看了一道编码的题
System.out.println(new String("中文".getBytes("GB2312"), "GB2312")) //1
System.out.println(new String("中文".getBytes("GB2312"), "ISO8859_1")) //2
System.out.println(new String("中文".getBytes("ISO8859_1"), "GB2312")) //3
均是中文操作系统,但是分别打印在中文窗口和西文窗口(我对这个西文窗口的概念也不太理解,是不是不能打印汉字)
在中文窗口中的结果和原因我能理解,但是在西文窗口下的就不理解
西文窗口的结果:
????
????
中文
所给的解释如下:仅以第一个打印“中”为例
步骤 内容 地点 说明
01: C1C2 HelloWorld.java C1C2分别泛指一个ISO8859_1字符,“中”字被拆开
02: U3U4 JAVAC读取 U1U2泛指一个Unicode字符
03: C5C6 getBytes() 第一步 JAVA先和操作系统交流,这时解析错误
04: B5B6B7B8 getBytes() 第二步 然后返回字节数组
05: C5C6 new String() 第一步 JAVA先和操作系统交流
06: U3U4 new String() 第二步 然后返回字符
07: C5C6 println(String) 虽然同是两个字符,但已不是最初的“两个ISO8859_1字
看的我很糊涂:中文操作系统默认都是gbk编码的,01为什么直接读入的是iso的编码,02的U3U4到底是什么,03为什么先和操作系统交流,如何解析错误,既然是西文窗口,那么为什么第三条语句可以打印出正确结果
希望高人指点
原文网址:http://www.ourmis.com/article/html/22762.html
我只是想知道,为什么那么脑残,要转来转去的?
java在内存当中永远保存Unicode的,
输入的时候,告诉你的java程序,这个输入流是什么环境,java会自动把这些转为Unicode存起来用。
输出的时候再告诉java程序,我想要以什么格式输出,java又会自动帮你做。
为什么要嘎费劲@@
没什么,因为以前工作中遇到过,跨平台的,网络的,自己只是懂个一知半解,想找时间把编码好好看看,结果越看越纠结。
而且如果所有的东西都能真的按照你的想法进行的,那么那些搞测试的,找bug的是不是都要下岗了。
你如果非要搞清楚,
首先要搞清楚所有的涉及到的编码。这个问题中涉及到的实体有:
1. 源代码
2. 内部
3. 终端
由LZ所说,是英文系统,那么我们大胆地假设,源代码的编码是ISO-8859-1.
因此,对于载入执行java程序这个过程来说,输入是源代码,输出是内存。编译器会自动地检测到这个源文件是ISO-8859-1的编码,于是已经正确地把“中文”变成了Unicode码放在内存里。但是上面的例子,非说那是“GB2312”的,那自然最后是错的。
从内存到终端这个过程,输出是终端。不同的终端支持不同的编码格式。幸运的是该系统的终端支持GB2312这种格式,所以当程序员指定以2312输出的时候,该终端正确显示了。有的终端不支持2312,那以2312输出,肯定也是乱码。
getBytes的用法,并不是用来处理硬编码在源代码内部的字符串的,硬编码在源代码内部的字符串,已经由javac编译器处理了。getBytes是用来处理,你得到的输出流来自于系统外部的,比如网络输入等,这时,由于系统和虚拟机无法进行介入,需要程序员明确指定,得到的输入流是什么编码方式。
【 在 ericyosho 的大作中提到: 】
: getBytes的用法,并不是用来处理硬编码在源代码内部的字符串的,硬编码在源代码内部的字符串,已经由javac编译器处理了。getBytes是用来处理,你得到的输出流来自于系统外部的,比如网络输入等,这时,由于系统和虚拟机无法进行介入,需要程序员明确指定,得到的输入流是什么编码方式。
getBytes应该就是unicode->指定编码字节数组,默认为系统编码
其实这个过程通过这段学习都明白了,就是忽然昨晚看到那个帖子没看明白。中文操作系统下西文窗口的输出,它对过程描述的很详细,但是就是有几个问题很纠结,我已经列出。可能太细节了,个人也觉得似乎没必要了。