您的位置:首页 > 编程语言 > Java开发

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

2014-05-22 00:48 288 查看
原题很简单:下面语句打印会出什么结果?给出解释。语句:

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 编码有关?需要继续探究...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 编码