求教控制台输入数据的编码问题

结贴是美德 2012-01-14 08:01:03
我一直有个疑问:我在myeclipse这种IDE中的控制台输入的字符是什么编码的?
跟什么因素有关系?IDE设置?操作系统?
还有,system.in是个InputStream,用它读不出String,是不是得加个InputStreamReader?
我自己写了个程序,想看看编码,但是程序的输出我自己也没看明白。。也许是我写的有问题,请高人指教
谢谢~~


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class In {
public static void main(String[] args) throws IOException {

//用你这个字做实验,我想看看在各种编码下,二进制都是什么样子
String s = "你";
PrintBytes(s.getBytes("GBK"));
PrintBytes(s.getBytes("UTF-8"));
PrintBytes(s.getBytes("GB2312"));

while (true) {
PrintOneByte((byte) System.in.read());
}

}

//以二进制形式输出一个byte数组
static void PrintBytes(byte[] bytes) {

for (int i = 0; i <= bytes.length - 1; i++) {
//调下面那个函数。。
PrintOneByte(bytes[i]);
}
System.out.println();
}

//以二进制形式输出一个byte
static void PrintOneByte(byte oneByte) {

int shadow = 1;

int temp = (int) oneByte;
for (int p = 7; p >= 0; p--) {
if ((temp & (shadow << p)) != 0)
System.out.print(1);
else
System.out.print(0);
}
System.out.print(" ");
}
}



下面是程序的输出:
11000100 11100011 //GBK
11100100 10111101 10100000 //UTF-8
11000100 11100011 //GB2312
你 //我在控制台输入中文“你”,下面是结果,和上面三种编码没有一个相同的。。
11100110 10110101 10100011 11101111 10111111 10111101 00001010
00001101 00001010 //这个事直接按回车生成的CR和LF 我查了ASCII。
...全文
191 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
结贴是美德 2012-01-14
  • 打赏
  • 举报
回复
我用cmd湿了一下 显示正常,吧IDE的设置改回来也正常了。接分!
MiceRice 2012-01-14
  • 打赏
  • 举报
回复
把你的Java文件的保存字符集,修改为GBK,再跑跑程序看有没有差异?
结贴是美德 2012-01-14
  • 打赏
  • 举报
回复
貌似这个file.encoding是IDE对操作系统编码的假设。。
结贴是美德 2012-01-14
  • 打赏
  • 举报
回复
我的显示UTF-8.。。。。。。。。。。。。。。。。。。。。。。。。

一直不明白file.encoding的作用,自己胡乱改过。。
MiceRice 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ldh911 的回复:]
另外你可以检查下你环境的字符集:
String encoding = System.getProperty("file.encoding");
System.out.println(encoding);
[/Quote]

我的显示:GBK
结贴是美德 2012-01-14
  • 打赏
  • 举报
回复
我也是win7中文版 怪怪怪。。
结贴是美德 2012-01-14
  • 打赏
  • 举报
回复
哎 哇咔咔 你的竟然能对应上。。。。为什么我的输出不是呢。。。。
MiceRice 2012-01-14
  • 打赏
  • 举报
回复
Java汉字内部处理是Unicode,2位定长,这就是为啥处理字符串的时候,一个汉字占用2个byte。

但是Java在做存储的时候,用的是UTF-8,这个是变长的,不过汉字都是3个byte,也就是你打印出来的效果。

另外你可以检查下你环境的字符集:
String encoding = System.getProperty("file.encoding");
System.out.println(encoding);


关于字符集的,我知道alexandertech(艾瑞克.泰)比较精通,问问他吧。
MiceRice 2012-01-14
  • 打赏
  • 举报
回复
不好意思,楼主,我命令行模式下输出的结果是:

D:\develop\workspace\0_tmp_test\bin>java 测试IN -cp .
11000100 11100011
11100100 10111101 10100000
11000100 11100011

11000100 11100011 00001101 00001010

对了,我操作系统是Win7中文的。另外GB2312字符集可以理解为GBK字符集的子集。

62,614

社区成员

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

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