主要说一下我遇到的一个问题,就是网上关于char字符的取值范围定义,有的说是0-255,有的说是\u0000 - \uffff。
其实,这两种说法都对。
我们都知道,java中给char字符的解释是十六位,双字节,也就是按照补码的方式寻求取值范围,就是2^16 - 1,65535,可是有些说法是它的取值范围是0 - 255,数值相差太大,问题就出现在了这里。
后来各种百度,发现是java编码的问题,前一种说法中的0-255说的是ascill编码格式,一些常用的英文以及符号都在0 - 255范围之内放着,其余位置并没有存放东西,所以就有了0 - 255取值范围的说法,但世界上的语言很多,尤其是汉语,如果只有英文没有汉语(不讨论GBK),那会非常不方便,所以就有了另一种通用的编码格式unicode编码。
Unicode:采用的是十六进制形式,输入的时候采用 '\uxxxx'形式,除了前边的0-255,还在剩余的空间中加入了其余的符号,比如欧洲的一些语言,中国的汉语,而我们的汉字编码是从\u4e00开始,一直到\u8c9f结束,这也将剩余的空间占用了,也就有了取值范围是\u0000 - \uffff的说法,不过可惜汉字很多,unicode编码只收录了一部分常用的汉字。
java中的编码采用的就是unicode编码,源文件使用的是utf-8编码,jvm虚拟机找的.class编译文件使用的是utf-16编码格式。
到此我的疑问就解决了,纯手打,有不对的地方欢迎指正。
(ps. Unicode与ascill重复的部分采取的是取交集,所以在Unicode中a 对应的数字是97,与ascill吗表一样,当时我在这里踩坑了很久)
例子:输出所有的汉字:
public class Arithmetic extends JFrame {
public static void main(String[] args) {
int count = 1; //记录汉字的个数
for(char c = '\u4e00'; c <= '\u8c9f'; c++ ) {
System.out.print(c + "\t");
count++;
if (count % 10 == 0) {
System.out.println("");
}
}
System.out.println(count);
}
}