char类型与Unicode的编码
的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语言使用的字符码集是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、代码点和代码单元的概念了,详见
的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、代码点和代码单元的概念了,详见
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论