一

{"type":"编程笔记"}


  • Home

  • Archives
  • Search

unicode spaces and rlo/lro

Posted on 2008-10-12   |   In vim

看下面2行的区别并复制下面第一行到任何文本编辑器中查看效果。

Read more »

如何禁止网页打开时ie弹出的安全警告

Posted on 2008-10-12   |   In javascript

当直接双击打开一个有javascript代码的网页,ie6/ie7会在窗口顶部出现一条黄色警告信息,内容如下所示:

Read more »

javascript demo scene [cool]

Posted on 2008-10-12   |   In javascript

用极少的javascript代码实现非常cool的效果,都用到了数学函数。

Read more »

md5值相同的二个字符串

Posted on 2008-10-12   |   In ruby

md5 collision

Read more »

utf-8 和 unicode 之间相互转换

Posted on 2008-10-11   |   In linux

UNICODE 基本知识

Unicode 及编码方式概述,这篇文章写得非常详细,不明白的细节可以参考那篇文章。

UTF-8 编码

UTF-8是UNICODE的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

  1. 对于单字节的符号,字节的第一位设为0,后面 7 位为这个符号的 UNICODE 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的,因为首位是0,所以只能表示U+0000到U+007F范围内(十进制为0 ~ 127)。
  2. 对于 n 字节的符号(n>1),第一个字节的前 n 位都设为1,第 n+1 位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 UNICODE 码。

下表总结了编码规则,字母 x 表示可用编码的位。

unicode 符号范围 utf-8 编码方式
十六进制 二进制
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

从上表可以看到:

  1. 首字节前几位可以看出这个UNICODE字符的长度,如:
    1. 110开头的则说明这个字符是2BYTE的UNICODE字符;
    2. 1110开头则是3BYTE的UNICODE字符;
  2. 需要注意的是单字节字符第一位上是0,而不是10;
  3. 而10开始的字节被用于 2 个字节长度以上的UNICODE字符的非首字节上。

所以从0,10,110,1110这些字节点的设计利用上可以看到UTF-8编码设计非常巧妙。

以汉字严为例,演示如何实现UTF-8编码。

已知严的 UNICODE 是4e25(100111000100101),根据上表,可以发现4e25处在第三行的范围内(0000 0800-0000 ffff),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码是 "11100100 10111000 10100101",转换成十六进制就是e4b8a5。

在 firebug 中测试中文"胡"字:

Read more »
1…666768…99
yuweijun

yuweijun

492 posts
12 categories
RSS
GitHub Twitter
© 2021 yuweijun
Powered by Hexo
Theme - NexT.Mist.KISS