【Java】为什么char占两个字符却能存汉字

问题:Java的char占两个字节,而汉字的UTF-8编码需要至少三个字节,为什么char可以存储汉字?

参考:https://blog.csdn.net/u010297957/article/details/48495791

Unicode
  • 字符集起源ASCII(American Standard Code for Information Interchange,美国标准信息交换代码),这是个单字节编码表,它能最多能表示256个字符(但实际上只用了7bit,128个。ISO8859-1使用8bit来表示,能表示256)。
  • 随着时间的发展,其它语言的人民也需要使用计算机,也需要编码自己的语言,很多国家和地区就各自使用了2个字节来表示自己的文字编码,如GBK、BIG5等。这种方式当然会造成不同语言编码和解码的混乱和错误,人们意识到需要一个统一的码表来囊括世界上所有的字符,从而实现编码的统一。
  • Unicode的出现解决了这个问题。它用2~4个字节的空间描述了已知的接近全部的字符,Unicode计划使用17个平面,一共有17*65535=1,114,112个码位。通常使用的plane 0也就是UCS-2,使用2个字节描述了比较常用的字符,包括大量的CJK文字,所以大家平常能用到的字符大体都在UCS-2中包括了
UTF-8(Unicode Transformation Format)
  • 事实证明,对可以使用ASCII表示的字符使用Unicode并不高效,因为Unicode使用2个字节。为了解决这个问题,出现了一些中间格式字符集,被称为通用转换格式。 可以这么说Unicode是编码方式,它规定了编码(即哪个字符在什么码位),而UTF-8等是Unicode的实现方式,它出于节省空间或其它目的来对Unicode所占空间进行转换。
  • 使用14个字节来编码,如,当时用UTF-8存储ASCII字符时就只用1个字节,相似其它字符按一定算法转换为14个字节。
Char
  • *java中的**char**确实使用2Byte空间,它实际使用的是UCS-2 也就是plane 0,只能表述65536个字符*
  • 对于超出其范围的其它plane内容,编译器会直接报错!
  • 尽量别用char类型,因为它会导致一些隐蔽的错误。比如,当你在用String时你定义了一个其它plane的字符,你想当然的认为一个char就能盛放String中的一个字符(毕竟char是字符,而String就是描述的char数组),但是你会发现其实这个String的length()是2而不是1,因为它超出了UCS-2,String用两个char的位置(4字节)来表示了这个char,而String本该用一个char的位置来表示它才对。
String
  • String在Java中是被定义为char数组来组织的,所以你定义的String最终要被转换成char来存放,但是,不要认为超出char的65536就不能存了,如果超出了它会用2个char来存放
  • 无论.java文件你用GBK或者UTF-8来编码,编译器在将其编译为.class文件后,如果其中有字符串,会使用UTF-8来编码存储字节,占用1-4Byte

总结

  1. char可以存储汉字是因为char使用的是unicode编码,且仅使用plane0中包含的字符。unicode的plane0占用两个字节,因此char也占两个字节。
  2. 超出plane0的字符写到char中会报错,但是可以写到String中,占用两个char。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值