一道习题引发的思考——Java字符运算
2014-05-22 00:48
288 查看
原题很简单:下面语句打印会出什么结果?给出解释。语句:
想必有Java基础的一看就知道结果:197。原因也很简单:Java中涉及 byte、short 和 char 类型的运算操作,会先把这些值转化为 int 类型,然后对 int 型值进行运算。在我印象里,这个字符运算出的结果应该是 ASCII 码值,所以我搜索了一下ASCII
码表,查到 197 对应的 ASCII 码为 Å(从外观上看是大写 A 上面一个圈)。于是乎我简单的用强制类型转换输出这个 ASCII 码字:
结果在 Console 输出了一个问号:?。而问号的 ASCII 码值为 63。为什么会输出问号?
首先排除了溢出的可能,显然 197 在 ASCII 码范围内。那么就要考虑输出编码的问题。上网搜素了关于 Java 输出 Å, Ä or Ö 的问题,在 StackOverflow 找到了一篇相关文章:How
to check if a string contains Å, Ä or Ö character in java servlet?,上面提到了输出扩展 ASCII 的方法:
当我把这段代码复制到 Eclipse 里面,保存的时候 Eclipse 提示:“该文件不能保存为 GBK,需要按照 UTF-8 格式保存。我就保存成 UTF-8,然后运行,结果就是每个 ASCII 码都正确的输出了!
这就有点头绪了。我又创建了一个默认的类,去掉上面的注释内容,保存的时候就没有提示了,再次运行,只有部分扩展 ASCII 能够正确输出,其余都是问号,呵呵!
这也就是说,由于 Windows 版本的 Eclipse 默认编写文件代码格式为 GBK,造成上面的输出产生了问题,换成 UTF-8 格式便可解决。
但这是为什么呢?为什么 Java 的控制台输出和当前文件的编码有关?莫非和 Java 输出机制有关,还是说和 GBK 编码有关?需要继续探究...
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 null笔试题引发的思考
- 一道二级C题引发的思考-- c++函数传递指针的本质 与 字符串指针与字符数组的区别
- 黑马程序员---Objective-C基础学习---一道课后习题引发的思考
- JAVA学习提高之---- 一道面试题引发的思考之:类的初始化
- 由一道 Java finally 执行顺序的题引发的思考
- 多线程环境下对变量的读写操作的原子性问题(一道百度笔试题引发的思考)
- 由阿里一道笔试题引发的思考
- 由java.lang.OutOfMemoryError:java heap space引发的关于JVM优化的思考
- 有 一道清华复试上机题 引发的思考,持续更新中……
- 一道面试题目引发的思考
- 一道面试题引发的有关随机数的思考(7)
- 一道考研题引发的思考~
- 由一道面试题引发的思考
- 由一道PHP笔试题引发的思考(关于php5的Iterator接口)
- 一道面试题引发的有关随机数的思考(4)
- 一道面试题引发的有关随机数的思考(5)
- 一道面试题引发的有关随机数的思考(1)
- 一道算法引发的思考:编程之外,我们还要关注什么
- java求复数四则运算,习题5.23(最终版)
- 由JAVA参数传递引发的对引用的思考