对java中char的取值范围思考

主要说一下我遇到的一个问题,就是网上关于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);

    }

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值