通用字符集(UCS)
UCS是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所制定的标准字符集。
UCS包括了其他所有的字符集(包含了已知语言的所以字符)。
ISO/IEC 10646定义了一个31位的字符集(首位恒定为0,占用4字节)。
Unicode(万国码、国际码、统一码、单一码)
编码方式:
Unicode编码空间从“U+0000”到“U+10FFFF”(共1112064个码位),Unicode的编码空间划为17个平面,每个平面包含216(65536)个码位。17个平面码位可表示为“U+xx0000”到“U+xxFFFF”(xx表示十六进制从 0016到1016,共计17个平面)。第一个平面称为基本多文种平面,其他平面为辅助平面。
Unicode目前实际应用的版本对应于UCS-2,使用16位的编码空间(占用2字节,最多可表示216=65536个字符),但当前版本并未完全使用这16位编码,仍保留了大量空间以作为特殊使用或将来扩展。
上述16位Unicode字符构成了基本多文种平面(属于UCS级别3,简称BMP,又称“零号平面”)。最新(未实际广泛使用)的Unicode版本又定义了16个辅助平面,共占用4字节编码空间,与UCS-4(未来版本将会达到,UCS-4为31位字符集,加上首位恒为0,共占32位,4字节,最多可表示231个字符)一致。
基本多文种平面的字符的编码为“U+hhhh”(h为一个十六进制数字),与UCS-2编码完全相同。同一字符UCS-2对应的UCS-4编码后两字节相同,前两字节均为0。
实现方式(UTF):
在不同平台上,为了节省空间,Unicode编码的实现方式不同。
例如,对一个仅含基本7位ASCⅡ字符的Unicode文件,如果每个字符以2字节的原Unicode编码方式传输将浪费巨大空间。对于这种情况,可以采用UTF-8编码(占用一个字节,后7位为原ASCⅡ编码,首位补0)。对于ASCⅡ与其他Unicode字符混混的情况,将通过算法转换,每个字符使用1-4个字节编码。
代码点/代码单元(JDK 5.0)
代码点(code point)是指与一个编码表中的某个字符对应的代码值(Unicode编码方式)。
Java中,char类型用UTF-16编码描述一个代码单元(code unit)。
UTF-16采用不同长度的编码表示所有的Unicode代码点。在基本多文种平面,每个字符用16位表示(通常称为一个代码单元);辅助字符采用一对连续的代码单元(32位)表示。
参考链接
- Unicode:http://zh.wikipedia.org/wiki/Unicode
- UCS:http://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%AD%97%E7%AC%A6%E9%9B%86
- UTF-16:http://zh.wikipedia.org/wiki/UTF-16
写在最后
这次的排版借鉴了维基百科的排版方式,前三次的笔记,每次排版都不太一样 XD
UCS、Unicode、UTF,越看越晕,越写越不知道在写什么。怎么写的和Java一点关系都没有啊!
发现好像可以用一句话直接总结:Java里的字符串就是由char类型序列,一个个的代码点表示的,大部分常用字符(基本多文种平面)的代码点使用一个代码单元(2字节),辅助字符则为一对代码单元(4字节)。