一道习题引发的思考——Java字符运算

原题很简单:下面语句打印会出什么结果?给出解释。语句:

System.out.println('b' + 'c');

想必有Java基础的一看就知道结果:197。原因也很简单:Java中涉及 byte、short 和 char 类型的运算操作,会先把这些值转化为 int 类型,然后对 int 型值进行运算。在我印象里,这个字符运算出的结果应该是 ASCII 码值,所以我搜索了一下ASCII 码表,查到 197 对应的 ASCII 码为 Å(从外观上看是大写 A 上面一个圈)。于是乎我简单的用强制类型转换输出这个 ASCII 码字:

System.out.println((char)('b' + 'c'))

结果在 Console 输出了一个问号:?。而问号的 ASCII 码值为 63。为什么会输出问号?

首先排除了溢出的可能,显然 197 在 ASCII 码范围内。那么就要考虑输出编码的问题。上网搜素了关于 Java 输出 Å, Ä or Ö 的问题,在 StackOverflow 找到了一篇相关文章:How to check if a string contains Å, Ä or Ö character in java servlet?,上面提到了输出扩展 ASCII 的方法:

byte[] data=new byte[1];
data[0]=(byte)197;  //197 is for Å
String char1=new String(data,"ISO-8859-1");
//循环输出所有扩展 ASCII 码
for (int i = 127; i < 256; i++) {
	byte[] chars = new byte[1];
	chars[0] = (byte) i;
	try {
		//'i' will give u code. 197 is for Å so on.
		System.out.println("Data : " + chars + "," + new String(chars, "ISO-8859-1") + "," + i);
	} catch (UnsupportedEncodingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

当我把这段代码复制到 Eclipse 里面,保存的时候 Eclipse 提示:“该文件不能保存为 GBK,需要按照 UTF-8 格式保存。我就保存成 UTF-8,然后运行,结果就是每个 ASCII 码都正确的输出了!

这就有点头绪了。我又创建了一个默认的类,去掉上面的注释内容,保存的时候就没有提示了,再次运行,只有部分扩展 ASCII 能够正确输出,其余都是问号,呵呵!

这也就是说,由于 Windows 版本的 Eclipse 默认编写文件代码格式为 GBK,造成上面的输出产生了问题,换成 UTF-8 格式便可解决。

但这是为什么呢?为什么 Java 的控制台输出和当前文件的编码有关?莫非和 Java 输出机制有关,还是说和 GBK 编码有关?需要继续探究...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值