b47617

攀登!进步!
随笔 - 20, 文章 - 1, 评论 - 0, 引用 - 0
数据加载中……

转 Unicode是什么.

析Unicode和UTF-8

1.      各地的方言

  首先说明一下现在常用的一些编码方案:

1.         在中国,大陆最常用的就是 GBK18030 编码,除此之外还有 GBK GB2312 ,这几个编码的关系是这样的。

n         最早制定的汉字编码是 GB2312 ,包括 6763 个汉字和 682 个其它符号

n         95 年重新修订了编码,命名 GBK1.0 ,共收录了 21886 个符号。

n         之后又推出了 GBK18030 编码,共收录了 27484 个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在 WINDOWS 平台必需要支持 GBK18030 编码。

按照 GBK18030 GBK GB2312 的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。

 

2.         台湾,香港等地使用的是 BIG5 编码

3.         日本: SJIS 编码

2.      Unicode

  如果把各种文字编码形容为各地的方言,那么 Unicode 就是世界各国合作开发的一种语言。

  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是 Unicode 的最大好处。

 

  那么 Unicode 是如何编码的呢?其实非常简单。

  就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示 65536 个编码,够用吗?

  韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。

  比如:“文”字, GBK SJIS 中都是同一个汉字,只是编码不同而已。

  那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。

UCS-2 UCS-4

   Unicode 的学名是 "Universal Multiple-Octet Coded Character Set" ,简称为 UCS

  现在用的是 UCS-2 ,即2个字节编码,而 UCS-4 是为了防止将来2个字节不够用才开发的。 UCS-2 也称为基本多文种平面。

   UCS-2 转换到 UCS-4 只是简单的在前面加2个字节 0

   UCS-4 则主要用于保存辅助平面,例如 Unicode 4.0 中的第二辅助平面

   20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -    26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF

  总共增加了 16 个辅助平面,由原先的 65536 个编码扩展至将近 100 万编码。

3.      兼容 codepage

  那么既然统一了编码,如何兼容原先各国的文字编码呢?

  这个时候就需要 codepage 了。

  什么是 codepage codepage 就是各国的文字编码和 Unicode 之间的映射表。

  比如简体中文和 Unicode 的映射表就是 CP936 ,点 这里 查看官方的映射表。

以下是几个常用的 codepage ,相应的修改上面的地址的数字即可。

codepage=936 简体中文 GBK

codepage=950 繁体中文 BIG5

codepage=437 美国 / 加拿大英语

codepage=932 日文

codepage=949 韩文

codepage=866 俄文

codepage=65001 unicode UFT-8

 

最后一个 65001 ,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。

 

936 中随意取一行,例如:

0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH

前面的编码是 GBK 的编码,后面的是 Unicode

通过查这张表,就能简单的实现 GBK Unicode 之间的转换。

 

4.      UTF-8

  现在明白了 Unicode ,那么 UTF-8 又是什么呢?又为什么会出现 UTF-8 呢?

   ASCII 转换成 UCS-2 ,只是在编码前插入一个 0x0 。用这些编码,会包括一些控制符,比如 '' '/' ,这在 UNIX 和一些 C 函数中,将会产生严重错误。因此可以肯定, UCS-2 不适合作为 Unicode 的外部编码。

  因此,才诞生了 UTF-8 。那么 UTF-8 是如何编码的?又是如何解决 UCS-2 的问题呢?

例:

E4 BD A0          11100100 10111101 10100000

这是“你”字的 UTF-8 编码

4F 60            01001111 01100000

这是“你”的 Unicode 编码

 

按照 UTF-8 的编码规则,分解如下: xxxx0100 xx111101 xx100000

把除了 x 之外的数字拼接在一起,就变成“你”的 Unicode 编码了。

注意 UTF-8 的最前面3个 1 ,表示整个 UTF-8 串是由3个字节构成的。

经过 UTF-8 编码之后,再也不会出现敏感字符了,因为最高位始终为 1

 

以下是 Unicode UTF-8 之间的转换关系表:

U-00000000 - U-0000007F: 0xxxxxxx

U-00000080 - U-000007FF: 110xxxxx 10xxxxxx

U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

 

Unicode 编码转换到 UTF-8, 简单的把 Unicode 字节流套到 x 中就变成 UTF-8 了。

posted on 2006-03-21 21:26 原语 阅读(452) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: