`
yaochaosheng
  • 浏览: 52687 次
  • 性别: Icon_minigender_1
  • 来自: guangzhou
文章分类
社区版块
存档分类
最新评论

unicode--utf等编码基础

阅读更多

Unicode码扩展自ASCII字元集。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。Unicode最初打算作为ASCII的补充,可能的话,最终将代替它。考虑到ASCII是电脑中最具支配地位的标准,所以这的确是一个很高的目标。


ASCII适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。
Unicode码:Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容。


Unicode的最初目标,是用1个16位的编码来为超过65000个字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题(implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来实现16位的数据。
因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41. UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。
Unicode字符集可以简写为UCS(Unicode Character Set)。早期的Unicode标准有UCS-2、UCS-4的说法。UCS-2用两个字节编码,UCS-4用4个字节编码。
UTF8并不算是一种电脑编码,而是一种储存和传送的格式



以"I am Chinese"为例 
用ANSI储存:12 Bytes
用Unicode/UCS2储存:24 Bytes + 2 Bytes(header) 
用UCS4储存:48 Bytes + 4 Bytes(header)
以"我是中国人"为例 
用ANSI储存:10 Bytes 
用Unicode/UCS2储存:10 Bytes + 2 Bytes(header)
用UCS4储存:20 Bytes + 4 Bytes(header)

由此可见直接以Unicode/UCS的原始形式来储存是一种极大的浪费,而且也不利于互联网的传输(中文稍为合算一点

有见及此,Unicode/UCS的压缩形式--UTF8出现了:
1.每个英文字母、数字所占的空间为1 Byte!!!
2.泛欧语系、斯拉夫语字母占2 Bytes!!!
3.汉字占3 Bytes!!!——规定的!!!
由此可见UTF8对英文来说是个非常诱人的方案,但对中文来说则不太合算,无论用ANSI还是 Unicode/UCS2来编码都只用2 Bytes,但用UTF8则需要3 Bytes。

 

因此可以明白,java中的字符,字符串是使用unicode编码,占两个字符,可以容纳一个中文(而byte只有一个字节,不能容纳中文)。而中文字符串的getByte方法可以返回指定或默认的编码方式后得到的字节数组。如果为一个中文指定GBK等解码格式,可以返回2个字节的字节数组。如果不指定解码格式,会使用系统默认的utf-8,因此会返回三个字节的字节数组!!

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics