Unicode字符集与UTF-8、UTF-16的关系
首先甩出定义:
Unicode
Unicode(Universal Code 统一码)是基于通用字符集(Universal Character Set)的标准来发展, Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。UNICODE支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国象形文字)。但是,UNICODE并没有提供对诸如Braille, Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持。同时它也不支持如Ahom, Akkadian, Aramaic, Babylonian Cuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之类的古老文字。
事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。
unicode编码规范中常用的是utf-16和utf-8。
UTF-16
UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。
UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。
UTF-8
UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节。而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。UTF-8 可以在同一个页面显示中文简体繁体及其它语言(如日文,韩文) 。
实际表示ASCII字符的UNICODE字符,将会编码成1个字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的UNICODE字符转化成UTF-8将需要至少2个字节。
首先说明啊,人家是三种编码格式。不过UTF-8、UTF-16是Unicode的不同表现形式(和unicode的表现形式也不一样)。
首先可以认为UTF-8、-16与Unicode三种字符集内的字符相同,不同的是-8、-16在底层的编码格式。
(-8、-16是Unicode在底层的具体编码方式)
-8使用的字节数为1-6
-16使用的字节数始终为2,
但是ASC||码在-8中占1个字节,在-16中占两个字节,而且,在我们的数据传输中ASC||占很大比重,所以我们经常使用的是-8
但是-8在对字符串操作的时候没有-16方便,因为-16直接使用2位表示字符,都不用判断它用了几个字符,是哪几个。而-8得判断,还贼麻烦,我都不想看它的编码方式(底层原理),有兴趣的搜一下吧。
所以对于字符串操作的时候-16更方便,更快,可是它不利于网络传输,因为在网络传输中一旦其中的字符丢了一个。。。。。。整个字符串中的后面的,都没用了。可以自己考录一下为什么。(因为它判断不出来丢没丢啊它只会直接转换,-8可以,它有标志位)
(但是在网络传输中不是会检测吗????到网络的时候再考虑这个问题吧)
所以说,尽量用-8吧,如果你传递的都是汉语的话,考虑考虑16的方式,毕竟汉语在8中占3个字符。仅仅是想想哈,你别真用,人家用的都是-8,你用-16,人家转换不了。
另外说个题外话,昨天写的Java的多态、继承、还有调用方法的原理,五分钟之前阅读数98,5分钟后110.卧槽。。。。。。,好开心。希望大家可以在看我的博文可以找出错误,评论我一定会回的。希望传播的都是正确的知识。