Java的char型是非常独特的,占用两个字节,因为Java中char型采用了Unicode编码。

要理解这个问题,我们必须要理解什么是Unicode。

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。

Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。与ASC2和ISO-8859-1类似,Unicode是一种编码方式,但是它所包括字符的范围却与之前的所有编码方式有着天壤之别。Unicode是一个囊括了几乎世界上所有文字的字符编码表。它的目标是任何文字都可以在其中找到唯一的编码,例如0041表示了字符A,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。它所要解决的主要问题是:不同语言和地区之间字符编码转换的问题,如果采用了Unicode编码的话则不需要在不同的字符集之间切换,因为都包括在Unicode当中。

Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同,具体由UTF(UCS Transformation Format)规范规定,常见的UTF规范包括UTF-8、UTF-16、UTF-32。

Java语言中char类型采用UTF-16编码格式。
从JDK1.5开始,代码点(code point)是指与一个编码表中某个字符对应的代码值。在Unicode标准中,代码点采用16进制数写,并加上前缀U+,例如U+0041就是字母A的代码点。Unicode代码点可以分成17个代码级别(code plane)。第一个代码级别称为基本的多语言级别(basic multilingual plane),代码点从U+0000到U+FFFF,其中包括了经典的Uncode代码;其余16个附加级别,代码点从U+10000带U+10FFFF,其中包括了一些辅助字符(supplementary
character)。
UTF-16它采用不同长度的编码表示所有的Unicode代码点(是一种变长的编码方式)。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元惊醒编码。这样构成的代码值一定落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域(surrogate area)(U+D800到U+DBFF用于第一个代码单元,U+DC00到U+DFFF用于第二个代码单元)。这种设计十分巧妙,我们可以从中迅速的知道一个代码单元是一个字符编码,还是一个辅助字符的第一或第二部分。
强烈建议不要再程序中使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。可以采用转义序列符/u表示Unicode代码单元。(为什么呢?)


写了段代码,从中可以可以基本理解Java的char、Unicode、代码点和代码单元的概念了,详见 Java中的基础类型,用二进制表示数字

Java的char型是非常独特的,占用两个字节,因为Java中char型采用了Unicode编码。

要理解这个问题,我们必须要理解什么是Unicode。

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。

Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。与ASC2和ISO-8859-1类似,Unicode是一种编码方式,但是它所包括字符的范围却与之前的所有编码方式有着天壤之别。Unicode是一个囊括了几乎世界上所有文字的字符编码表。它的目标是任何文字都可以在其中找到唯一的编码,例如0041表示了字符A,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。它所要解决的主要问题是:不同语言和地区之间字符编码转换的问题,如果采用了Unicode编码的话则不需要在不同的字符集之间切换,因为都包括在Unicode当中。

Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同,具体由UTF(UCS Transformation Format)规范规定,常见的UTF规范包括UTF-8、UTF-16、UTF-32。

Java语言中char类型采用UTF-16编码格式。
从JDK1.5开始,代码点(code point)是指与一个编码表中某个字符对应的代码值。在Unicode标准中,代码点采用16进制数写,并加上前缀U+,例如U+0041就是字母A的代码点。Unicode代码点可以分成17个代码级别(code plane)。第一个代码级别称为基本的多语言级别(basic multilingual plane),代码点从U+0000到U+FFFF,其中包括了经典的Uncode代码;其余16个附加级别,代码点从U+10000带U+10FFFF,其中包括了一些辅助字符(supplementary
character)。
UTF-16它采用不同长度的编码表示所有的Unicode代码点(是一种变长的编码方式)。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元惊醒编码。这样构成的代码值一定落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域(surrogate area)(U+D800到U+DBFF用于第一个代码单元,U+DC00到U+DFFF用于第二个代码单元)。这种设计十分巧妙,我们可以从中迅速的知道一个代码单元是一个字符编码,还是一个辅助字符的第一或第二部分。
强烈建议不要再程序中使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。可以采用转义序列符/u表示Unicode代码单元。(为什么呢?)


写了段代码,从中可以可以基本理解Java的char、Unicode、代码点和代码单元的概念了,详见 Java中的基础类型,用二进制表示数字

char类型与Unicode的编码的更多相关文章

  1. char和QChar(Unicode的编码与内存里的值还不是一回事)

    char类型是c/c++中内置的类型,描述了1个字节的内存信息的解析.比如: char gemfield=’g’;那么在由gemfield标记的这块内存的大小就是1个字节,信息就是01100111,8 ...

  2. char和QChar(Unicode的编码与内存里的值还不是一回事)

    char类型是c/c++中内置的类型,描述了1个字节的内存信息的解析.比如: char gemfield=’g’; 那么在由gemfield标记的这块内存的大小就是1个字节,信息就是01100111, ...

  3. 数据库char varchar nchar nvarchar,编码Unicode,UTF8,GBK等,Sql语句中文前为什么加N(一次线上数据存储乱码排查)

    背景 公司有一个数据处理线,上面的数据经过不同环境处理,然后上线到正式库.其中一个环节需要将数据进行处理然后导入到另外一个库(Sql Server).这个处理的程序是老大用python写的,处理完后进 ...

  4. 在vs中char类型的实参与LPCWSTR类型的形参类型不兼容怎么解决?

    今天在做 COS脚本解释器的时候,遇到了这个问题 先了解一下 LPCTCHAR 这个东东 LPCTSTR用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么 ...

  5. char类型的说明

    CREATE TABLE [dbo].[CharTest]( ) NULL, ) NULL, ) NULL, ) NULL ) insert into dbo.CharTest ( Char, Var ...

  6. NSString / NSData / char* 类型之间的转换

    转自网络: NSString / NSData / char* 类型之间的转换 1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; ch ...

  7. char类型的数值转换

    在视频教程中,你已经认识到了数字类型之间.字符串和其他类型之间的转换.而某些时候,我们还需要将char类型转换为int类型,或者把int类型转换为char类型. 这篇文章,将介绍在代码中虽然不太常用, ...

  8. C# 调用C/C++动态链接库,结构体中的char*类型

    用C#掉用C++的dll直接import就可以之前有不同的类型对应,当要传递结构体的时候就有点麻烦了,这里有一个结构体里边有char*类型,这个类型在C#中调用没法声明,传string是不行的默认st ...

  9. 关于char类型的说明

    #include<iostream> using namespace std; int main() {  char ch=128;//VC编译器默认是有符号的.但c并未明确给出.由编译器 ...

随机推荐

  1. [Js]面向对象基础

    一.什么是对象 对象是一个整体,对对外提供一些操作 二.什么是面向对象 使用对象时,只关注对象提供的功能,不关注其内部细节,比如Jquery 三.Js中面向对象的特点 1.抽象:抓住核心问题 2.封装 ...

  2. Java longTime 和C#日期转换

    封装一下,可直接用. 以后碰到java的long time,直接使用DateTime dt=ConvertJavaDateTimeToNetTime(1207969641193);这样使用即可. 这串 ...

  3. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  4. IE7的overflow失效的解决方法

    IE7的position:relative bug今天遇到了一个相对定位(position:relaitve)引起的IE7中overflow:hidden失效的bug,特此记录!解决方法很简单,给父层 ...

  5. Spring学习笔记之Bean的实例化

    一.bean的实例化方法有3种, 1.构造器实例化 2.静态工厂方法实例化 3.实例工厂方法实例化 二.用构造器来实例化 <bean id="ShunDao" class=& ...

  6. 百度地图开发 android App 数字签名(SHA1)获取办法

    简述: a.输入keytool -list -v -keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android),这个获取到的SHA1的值和e ...

  7. JS事件大全

    橙色表示“非常常用”  绿色表示“常用” onClick IE3|N2|O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDblClick IE4|N4|O 鼠标双击事件 onMouseD ...

  8. hdu1116 欧拉回路

    //Accepted 248 KB 125 ms //欧拉回路 //以26个字母为定点,一个单词为从首字母到末尾字母的一条边 //下面就是有向图判断欧拉回路 //连通+节点入度和==出度和 或者 存在 ...

  9. Ogre中Mesh的加载过程详述

    转自:http://blog.csdn.net/yanonsoftware/article/details/1031891 如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点.当一个看似简单 ...

  10. SDIO接口

    SDIO卡是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备,目前根据SDIO协议的SPEC,SDIO接口支持的设备总类有蓝牙,网卡,电视卡等. ...