首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

Unicode简述

Unicode in a Nutshell

提到Unicode,人们对于它是什么,它对软件开发意味着什么,有着种种看法。我们首先要做的,是消除这些先入为主的揣测,从一张白纸开始,从基础原理出发来讨论Unicode。说到基础,那么找不到比图4-1更为基础的了。

图4-1:字母“a”

这是什么? 这是一个小写拉丁字母“a.”。好吧,其实它是油墨在纸上形成的一种图案(或者说像素在屏幕上形成的图案,具体取决于介质),表示大家一致同意的一个字母形态。 我们将称这个形状为一个字形。这只是许多字形中的一个,代表小写拉丁字母“a.”。图4-2也是一个字形。

图4-2:一个不同的字形

它由不同的曲线构成了不同的形状,但还是表示同一个字符。还好,到目前为止一切都还比较简单。每个字符有多种字形表示。在电脑层面,我们称这些字形集合为字体。 当我们需要存储一个序列的这些字符时,我们通常只储存字符,而不是字形本身。另外还可以储存信息,记录使用哪种字体来渲染字符成为字形。但核心信息仍然是一个字符序列。那么,我们如何才能跨跃鸿沟,将小写拉丁字符“a”变成二进制序列01100001?这需要两套映射(它们经常在一起而被当成是一组)。首先是字符集,它告诉我们如何处理抽象字符,并使之成为数字。其次是编码,它告诉我们如何处理这些数字(或者叫码点),用比特和字节表示它们。因此,让我们重温一下,图4-3是什么?

图4-3:还是关于字形“a”的问题

它是代表小写拉丁字符“a”的字形。ASCII字符集告诉我们,小写拉丁字符“a.”的码点是0x61 (十进制是97)。ASCII编码告诉我们,我们就可以用单字节0x61来代表码点0x61。

Unicode的设计和ASCII码很兼容,因此所有的ASCII码点在Unicode中是相同的。也就是说,小写的拉丁字母“a”的Unicode也是码点0x61。在UTF-8编码中,将编码点0x61表示为单字节0x61,就和ASCII编码一样。在UTF-16编码中,码点0x61是作为两个字节由0x00到0x61的。我们也会简单地看一些不同的Unicode编码。

格式化惯例

在Unicode中,以U+AAAA的格式表示码点,AAAA是一个4位十六进制数。对于超出U+FFFF范围的码点,表示该码点以所需要的最小数目的数字被使用。例如,kharoshthi中的“A”的码点被表示为U+10A00。在整个章节中,我们都将会用这个格式表示码点,并且用0xAA格式来编码字节。

那么,为什么我们要使用Unicode,就因为它看起来和ASCII差不多吗?可以用一件ASCII做不到的事为例,就可以很容易地回答这个问题,请看图4-4中的字符。

图4-4:明显不在ASCII码中的一个字符

这是Bengali Vocalic RR字符,Unicode的码点是U+09E0。在UTF-8编码风格中,这个码点映射到0xE0、0xA7和0xA0这几个字节上。对于UTF-16编码,相同的码点会映射到一对字节0x09、0xE0上。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论