

请先看一段代码:

看完这段代码后,您的第一感受是什么?
“新手写的程序!大错特错!”
的确,这是一个刚刚开始学习JAVA语言的同学编的。他不太理解得出的结果,找到我想寻求帮助,我的第一个反应是:”为什么日食不报错?”然后,静下心来分析了一下,我恍然大悟,里面竟蕴藏着一个我们不太注意的概念,UNICODE。
好!现在就让我来解释一下。
我想如果您是一个编成的老手肯定不会出这样的错误,但是,如果让您立刻反应出上面程序的输出结果,也不是件容易的事。想看看结果吗?好!

我敢说,很出乎您的意料吧。
在这里,我顺便说说,学习编程时的心态。我们不要只关心输出结果的对错,更重要的是过程,每个环节都清楚了,结果自然是我们想得到的,如果,结果出和你的想法不一样,别急,静下心来分析,一定要很好的记录下出错的信息。这样我们才可以顺藤摸瓜,找到错误的缔结。
可以这么说,错误和正确比,错误能够给你带来更大收获。所以,我们不要放过每一个错误,因为,这正是提升你的好机会。
还有,应该做到错误共享,可以借助QQ群来sharing 一下你的错误,这样做,第一可以更好的加深自己的印象,第二可以让别的同学不要走同样的弯路。
好了,回到正题(unicode)上来吧。
不知道您想过没有,在我们做System.out.println()时,如果,字符串定义为一串中文的时候,系统不会报错,甚至能够清楚地打印出中文来,这是什么原因呢?
正是由于JAVA核心的字符是基于UNICODE的,这一机制为应用提供了对中文”字”的控制(而不是字节)。如果,您从网上google一下可以找到很多unicode的内容,这里我只是想用实例来说说,unicode的概念和用途。
首先,我们知道,char型是以2个字节来存储的。也就是在内存中,占用了16位,他所能表示的最大的数是65535。也就是(2的16次幂)。
于是我设计了这么个程序。

目的就是想看看,前128个字符(也就是ASCII码)的输出情况。看看结果。

让我们再借助其他软件来比较一下。(DotFont16X16)

完全相同。
还是简单的说说,UNICODE概念吧。通过实例概念更容易理解和掌握。
Unicode是一种兼容ASCII字符并在多种程序种被支持的字符集。它的最先的128个Unicode字符对应着ASCII字符并且具有相同的byte值。Unicode字符U+0020到U+007e同ASCII自渎0x20和0x7e是等价的。但是不同于ASCII,因为支持拉丁字并使用了7-bit字符集,Unicode使用了一个16-bit的值来表示每个字符。
好了,我们知道UNICODE使用16-bit的值来表示每个字符。让我们看看最初关于”男”和”女”的问题吧。

结果是这样的。

PIC1.1

PIC1.2
我们终于找到”男(PIC1.2的最后一行的正数第八个)”和”女(PIC1.1的第一行正数第四个)”。相信,不用多说您也恍然大悟了吧,如果,还有些不明白的地方可以GOOGLE一下,也会豁然开朗的。
那么JAVA这么做后的作用是什么呢?相信,经常上网的人,或者浏览过日文网站的人,肯定能够说的出。这么一来,JAVA的Web就支持了多种语言,包括美国,欧洲,中东,非洲,印度,亚洲和太平洋地区地语言。那么也就是说:一个256个数的字符集,就对应一种语言。或者,你可以把UNICODE想象成这样:让所有的字符(包括英文)都用2个字节(2个8位)表示,这样就有了一个2^(8*2) = 256 * 256 = 65536个格子的大棋盘。在这个棋盘中,这样中(简繁)日韩(还包括越南)文字作为一个字符集都放在一定的区位内,为了减少重复,各种语言中写法一样的字共享一个“棋格”。
好了,就说这么多吧,google是我们的24*365&free的老师。这里特别感谢,阿卡吧同学的支持。