J2SE——java&C++不同之字符型:Unicode编码 & ASCII及扩充ASCII编码

java是从C++的基础上衍生出来的,把C++当做java的基础,相较其它语言它们必定更相近,当然作为C++的改进版,从java改进的地方我们可以窥见出这种语言为什么能如此盛行,为什么能与老牌基础语言一争高下。

首先看基础数据类型的不同,对比一下C++和java基础类型占用空间如下图:


可以看出:

1)java有的基础数据类型C++都有;

2)java里没有C++基础类型的派生类型(就是字符型char、整型int等有没有修饰符号sign、长long短short等);

3)两种语言相同数据类型的存储空间大致相同,除了字符型char。


C++的char只占1byte,而java却要占2bytes,这是为什么呢?

我们看它们的取值范围:C++字符型的取值范围是全部基本字符以及ASCII码集或扩充ASCII码集对应的全部符号;JAVA字符型的取值范围是Unicode字符集


ok,那么什么是ASCII码?什么又是Unicode码?

这,就要追溯到晶体管了,简单的讲就是有个实验室发明了晶体管,每个晶体管可以表达一个二进制存储信息1bit(0、1)。计算机都是二进制存储的嘛,但是所有的数据都要这么精确表示就累死计算机了。所以有群人认为8个晶体管(历史上曾经4、6过,只是现在8位横行天下)可以表达一切信息,就发展成了现在最小的存储单元——字节byte,所以1Byte=8bit

一个8位的字节可以有2的8次方(256)种表示,最开始使用计算机的那拨人就把这256种规定了一下,0到32用作特殊用途,接点其他电子设备等等,之后用到的33到127位都是键盘上的键,这就是最初的ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)。后来为了编辑表格,又填了点横竖线什么的,因此128到255这部分叫“扩展字符集”。详情参见:百度百科:ASCII

当然当非英语国家使用计算机的时候,这128种里可没有他们的文字符号,怎么办?把127号后面全删了,构建我们自己的新标准,然后世界各地又兴起了一堆标准,比如中国的编码标准,把俩ASCII码凑一起表示中国字的双字节的GB2312

标准这么多,对编码就相当麻烦,没对上是很容易乱码,于是乎就得统一统一。统一首先解决字符不够的问题。重点就来了,新的标准直接采用双字节做一个存储单位,无论英文半角、还是中文全角的都用潇洒的占了一个2bytes的空间。这就是豪华大气的为统一全世界语言文字而诞生的Unicode编码

两个8位的字节可以有2的16次方(65536)种表示,基本字符已经妥妥的包括了。没包含的也有办法,为您准备了豪华UCS-4套餐,32bit,2的32次方,可以表达42亿+,还是够现代人使用的。当然目前USC-4这种方法最大的特点还是啰嗦,放心,我们一般不用它。

说到啰嗦,半角的英文占个2bytes的空间也是让我们感觉浪费,存储一篇英文文件,一半的空间用来装Unicode的高冷了。所以,Unicode又分成了UTF8(8位,网页比较流行)党和UTF16(16位,Windows模式下)党。


说了这么多,ASCII和Unicode差不多已经解释完了。

对比两种编码ASCII老牌,Unicode实现了大一统。java能开源,Unicode功不可没。索性Windows NT已经支持Unicode了,非相同语言的系统下交流Unicode可能比较好使,比如Windows的记事本。


这里有一个著名的现象,在Windows下新建一个txt文件,输入“联通”,保存→关闭→再打开,再出现的就是乱码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值