简单的理解unicode和utf-8的关系

来源:互联网 发布:艾瑞咨询好吗 知乎 编辑:程序博客网 时间:2024/06/05 11:12

目前,做了个简单的爬虫程序,爬取到utf-8的页面中竟然存在着混合了unicode的编码字符串的字符串 例如   \u1234中文

先说说如何将unicode的编码字符串转换成相应的编码对象

就想着用正则先将unicode过滤出来

正则式是(\\u[0-9,a-f]{4})

然后取出\uXXXX 后面四位编码 例如:\u65e0\u804a 取出来就是   65e0 和 804a

然后使用,

<span style="font-size:12px;"> String.valueOf((char)Integer.parseInt("65e0",16));</span>

就能得到相应的unicode的编码对象  “无聊”


在做测试的时候

如果你采用new String("\u65e0\u804a ")你是直接得到汉字“无聊”的

但是如果如果是采用的是一些外部读入的方式

得到的就是"\u65e0\u804a "  需要通过上面的方式进行转换

unicode-table 在这里 你能看到所有的unicode


为了了解unicode就去查了下unicode,下面都是个人的低级见解:

首先我们需要理解下字符编码

字符编码: wiki给出的解释:字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数串行、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。说简单点就是   为了方便计算机识别和传输而定义出来的字符的代号。

问题来了:

大家都定义了自己的编码方式,日本人用日本Shift_JIS编码的文件,我们用中文编码系统打开就会是乱码

世界上那么多的字,有的没的,谁知道啊。所以就有了unicode的存在,

总不能像office那样 什么编解码文件都装全了吧

所以unicode就为全世界所有的(绝大部分存在的)文字和符号都定义了相应的编码,随着文字的不断的增加,可以发现,用来定义编码的字节会从一个字节变成两个字节(UCS-2用两个字节编码),变成三个字节,变成四个字节(UCS-4用4个字节编码)。而本身英文只占一个字节,中文占两个字节,问题来了,编码已经比它所代表的文字占的存储空间大了。

现在理解起来就会简单了,为什么会有utf-8的存在,就是为了压缩unicode编码存储空间

UTF-8

UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(十六进制) 
UTF-8 字节流(二进制)
000000 - 00007F
0xxxxxxx(ASCII字符 )
000080 - 0007FF
110xxxxx 10xxxxxx
000800 - 00FFFF
1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(注意红字部分,几个1,就代表当前字符的编码有几个字节组成,解码时边会直接往后面字节读取)

例如"A"= 0x0043  utf-8只需要存储一个utf-8的字节流就行了

而中文“杨”是0x6768  utf-8就需要3哥utf-8的字节流去表示


至于utf-16和utf-32 都是以无符号的整数为单位







0 0
原创粉丝点击