Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的(ASCII码),它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布.
一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。
UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE 如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8 就是每次 8 个位传输数据,而 UTF16 就是每次 16 个位,只不过为了传输时的可靠性,从 UNICODE 到 UTF 时并不是直接的对应,而是要过一些算法和规则来转换。
UTF是Unicode TransferFormat的缩写,UTF-8和UTF-16都是把Unicode码转换成程序数据的一种编码方式。
-
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
像UTF-8里面,ASCII所表示的字符集就是用1 Byte来表示,而大部分汉字则是用3 Byte来表示。
相较于Unicode统一使用2 Byte来表示字符,在遇到大部分字符都可以用1 Byte表示时,能够节省许多存储空间。但是,如果遇到需要用超过2 Byte来表示的字符,那么UTF-8的编码方式则会消耗更多的存储空间。
-
UTF-16是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为 “storage format”)的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元, 长度为2 Byte)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示
引用维基百科中对于UTF-16编码的解释我们可以知道,UTF-16最少也会用2 Byte来表示一个字符,因此没有办法兼容ASCII编码(ASCII编码使用1 Byte来进行存储)。
-
GBK是个什么东西。GBK是国标扩(展)的拼音首字母,是我国在1995年制定的专门针对汉语和一些少数名族语言的编码方式,和Unicode之间没有一一对应的关系,也就是说Unicode中有的字符GBK不一定有,GBK有的字符Unicode也不一定有,而且GBK和Unicode中共有字符,他们的编码值没有一种简单的对应关系,也就是无法通过简单计算得到,只能通过查表转换。为什么会有GBK这种奇葩呢?其实是当时Unicode还没制定好,更没在全球范围内推广,而中国人要用电脑总不可能永远用英语吧?所以我国就自行制定了一个国标,当时是GB2312,(其实台湾地区针对繁体还有一个Big5,但这里就不详述了),GB2312后来增加了很多字符,包括很多少数名族的语言,成为了一个新的编码标准,那就是GBK。
-
一个汉字占几个字符?
这和编码有关,UTF8一个汉字占3个字节,GBK一个汉字占2个字节。在Java中,char类型描述了UTF-16编码中的一个代码单元
-
一个中文需要3个字节才可以存储,而char只有两字节?
java采用UTF-16编码,UTF-16有两种编码方式,2字节的和4字节的,2字节的编码后等于Unicode值
-
字节与字符:
- ASCII 码中,一个英文字母(不分大小写)为一个字节
- UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
- Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
- 符号:**英文标点为一个字节,中文标点为两个字节。**例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
- UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节**(Unicode 扩展区的一些汉字存储需要 4 个字节)**。
- UTF-32 编码中,世界上任何字符的存储都需要 4 个字节