您好,欢迎来到智榕旅游。
搜索
您的当前位置:首页unicode编码详解,一看就懂

unicode编码详解,一看就懂

来源:智榕旅游
unicode编码详解,⼀看就懂

⼀、Unicode编码

1 UTF-8 -16 -32编码和Unicode编码

  Unicode编码是⼀种计算机字符编码标准,其实个⼈认为叫字符集更为准确;⽽我们熟悉的UTF-8 UTF-16 UTF-32是Unicode的具体实现(怎么存储在计算机)。

  1)Unicode编码规范制定标准:

   把世界上所有能出现的字符,都为其分配⼀个数字来表⽰,⽐如,数字U+7F57被分配给了汉字中的\"罗\"字。Unicode编码的标准⾥字符数量⼀直实在新增(包括⼀些稀有字符,当然emoji表情字符也属于unicode编码哈哈),19年3⽉刚发布了Unicode12.0版本,⽐之前的版本新增了⼀些字符,现在在标准中的字符⼀共有137929个,⽽Unicode编码⽬前规划了U+0000⾄U+10FFFF为unicode编码(以世界上字符的数量应该是很久不会考虑扩展的),算⼀下⽬前还剩下976183(1114112-137929)个代码点,这976183个代码点是规划在unicode中的数字,但是还没被分配对应的字符。  2)UTF-8编码:

   UTF-8可以说是当前互联⽹最常⽤的编码格式了,它基于Unicode字符集进⾏编码设计。它最⼤的特点是变长字节的编码设计,⼀个字符最长4个字节,最少1个字节,⼤部分的中⽂字符占3个字节。   编码规则如下:

  1.⽤⼀个字节表⽰的字符,第⼀位设为 0,后⾯的 7 位对应这个字符的 Unicode 码点。由于这128个字符的unicode完全对照ASCII码,可以说完全向下兼容ASCII码。即ASCII编码的⽂件可以⽤UTF-8打开⽽不乱码;

  2.⽤⼀个字节以上表⽰的字符,假设是N个字节表⽰这个字符:则该字符第⼀个字节的前N位都为1,第N+1位为0,剩下的N-1个字节的前两位都设为10,剩下没有主动设值的位置则使⽤这个字符的Unicode⼆进制代码点从低位到⾼位填充,不够⽤0补⾜。   编码对照表如下:

Unicode字符集范围(⼗六进制) 0000 0000 - 0000 007F 0000 0080 - 0000 07FF 0000 0800 - 0000 FFFF 0001 0000 - 0010 FFFF

UTF-8编码(⼆进制) 0xxxxxxx

110xxxxx 10xxxxxx

1110xxxx 10xxxxxx 10xxxxxx

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

   结合编码规则和编码对照表,讲解汉字“罗”是如何编码和解码的:

   编码(encode): 字符“罗”所对应的unicode代码点由以上规则转化为UTF-8所对应的⼆进制数字,则称为编码。可以理解为使字符成为代码的意思,⽽解码就是代码成为字符。

   ⾸先“罗”对应了unicode中的U+7F57,对应编码表中第三⾏,也就是⽤3个字节来表⽰的字符,把7F57的⼆进制111 1111 0101 0111从低位对应补⾜到1110xxxx 10xxxxxx 10xxxxxx(从低位) 如下图所⽰:   最后成为11100111 10111101 10010111即⼗六进制E7BD97。

   解码(decode): UTF-8所对应的⼆进制数字由以上规则转化为unicode码再对应到具体字符,则称为编码。

   如11100111 10111101 10010111这段⼆进制编码,第⼀个字节是111,对应编码对照表则这段编码表⽰的字符由3个字节组成,⽤1110xxxx 10xxxxxx 10xxxxxx规则剔除出x对应的数为111 1111 0101 0111,即7F57,该数字对应unicode字符集中的字符“罗”。  3)UTF-32编码:

   同理和UTF-8基于unicode字符集。UTF-32编码为固定长度4个字节。因为unicode范围为00FFFF-10FFFF,4个字节表⽰的范围为00000000-FFFFFFFF,能直接表⽰所有unicode编码,不需要进⾏转换编码转换。以空间换时间。  3)UTF-16编码:

   UTF-16以2或者4个字节编码表⽰unicode字符:

   unicode字符集中,000000-00FFFF表⽰的字符,在UTF-16中⽤2字节直接编码表⽰,不需要编码转换,这点和UTF-32⼀样(这⾥有点需要说明⼀下, U+D800 到 U+DFFF 是⼀个空段,即这些码点不对应任何字符,4字节需要⽤到)

   unicode字符集中,010000-10FFFF表⽰的字符,在UTF-16中⽤4字节编码表⽰,但是需要进⾏编码转换。⽐如010000-10FFFF中的

某个字符X的uicode编码为AAAA AAAA AABB BBBB BBBB,分为⾼10位和低10位,⾼10位加上⾼位代理位D8(110110),低10位加上低位代理位DF(110111),即组成字符X的UTF-16编码110110AAAAAAAAAAA 110111BBBBBBBBBB。

⼆、java中的char类型

  java中char类型是2个字节长度,⼀个char在java中称作⼀个代码单元,⽽unicode的字符编码叫做代码点。也就是说utf-16编码中的0000-FFFF的范围可以⽤⼀个char表⽰,10000-10FFFF就需要⽤两个char来表⽰。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- zrrp.cn 版权所有 赣ICP备2024042808号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务