J2SE——java&C++不同之字符型:Unicode编码 & ASCII及扩充ASCII编码
2015-03-23 14:18
295 查看
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码集对应的全部符号;J***A字符型的取值范围是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文件,输入“联通”,保存→关闭→再打开,再出现的就是乱码。
首先看基础数据类型的不同,对比一下C++和java基础类型占用空间如下图:
可以看出:
1)java有的基础数据类型C++都有;
2)java里没有C++基础类型的派生类型(就是字符型char、整型int等有没有修饰符号sign、长long短short等);
3)两种语言相同数据类型的存储空间大致相同,除了字符型char。
C++的char只占1byte,而java却要占2bytes,这是为什么呢?
我们看它们的取值范围:C++字符型的取值范围是全部基本字符以及ASCII码集或扩充ASCII码集对应的全部符号;J***A字符型的取值范围是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文件,输入“联通”,保存→关闭→再打开,再出现的就是乱码。
相关文章推荐
- 关于C++&Java中命令行编译的问题
- Java和C++的几点不同之处
- Difference between Java & C++
- Java vs C++ "Shootout" Revisited
- USB口异常与C++&Java
- i = i++;在c++和java下的不同结果。
- 回复:delphi的接口的意义是不是跟C++和Java的不同呢?
- GNU/Linux Debian + MySQL 5.0+ Java + "C++" + Eclipse 的N种可能
- 对比C++和Java语言不同点
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列, 如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连.
- c++ --> java
- [C++]C++与JAVA类型转换的不同点
- USB口异常与C++&Java
- java和C++的不同
- USB口异常与C++&Java
- USB口异常与C++&Java
- USB口异常与C++&Java
- USB口异常与C++&Java
- USB口异常与C++&Java
- Java中"Test(Object...args){}"方法声明的理解——J2SE5的“Varargs”机制