简单的理解unicode和utf-8的关系
2014-08-11 19:43
260 查看
目前,做了个简单的爬虫程序,爬取到utf-8的页面中竟然存在着混合了unicode的编码字符串的字符串 例如 \u1234中文
先说说如何将unicode的编码字符串转换成相应的编码对象
就想着用正则先将unicode过滤出来
正则式是(\\u[0-9,a-f]{4})
然后取出\uXXXX 后面四位编码 例如:\u65e0\u804a 取出来就是 65e0 和 804a
然后使用,
就能得到相应的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编码存储空间
例如"A"= 0x0043 utf-8只需要存储一个utf-8的字节流就行了
而中文“杨”是0x6768 utf-8就需要3哥utf-8的字节流去表示
至于utf-16和utf-32 都是以无符号的整数为单位
先说说如何将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,就代表当前字符的编码有几个字节组成,解码时边会直接往后面字节读取) |
而中文“杨”是0x6768 utf-8就需要3哥utf-8的字节流去表示
至于utf-16和utf-32 都是以无符号的整数为单位
相关文章推荐
- 终于理解了unicode、utf-8、gb2312这些编码集之间的关系了
- 编码,charset,乱码,unicode,utf-8与net简单释义(转)
- 编码,charset,乱码,unicode,utf-8与net简单释义(续)
- ASCII,Unicode,UTF-8,GB2312编码之间的关系
- 编码,charset,乱码,unicode,utf-8与net简单释义(转)
- 编码,charset,乱码,unicode,utf-8与net简单释义
- ASCII,Unicode,UTF-8,GB2312一些关于字符编码的理解
- UTF-8,UTF-16,UNICODE,UNINCODE BIG ENDIAN的关系
- gbk, gb2312,big5,unicode,utf-8,utf-16之间的关系
- [笔记]unicode和UTF-8之间的关系
- 编码,charset,乱码,unicode,utf-8与net简单释义
- 复杂事件处理(Complex Event Processing)--1. 基本概念:事件,事件关系,事件处理的简单抽象理解
- 对各种字符集和字符编码的理解(Ansi,GB2312,Unicode,UCS,utf 8)
- ASCII,Unicode,UTF-8,GB2312编码之间的关系
- 编码,charset,乱码,unicode,utf-8与net简单释义(续)
- 编码,charset,乱码,unicode,utf-8与net简单释义
- gbk, gb2312,big5,unicode,utf-8,utf-16之间的关系
- 转: 编码,charset,乱码,unicode,utf-8与net简单释义(续)
- Unicode和UTF-8之间的关系
- 编码,charset,乱码,unicode,utf-8与net简单释义(转)