儿童汽车安全座椅中GROUP 0,GROUP 0+,GROUP 0-0+,GROUP 1,GROUP 2/3都是说的是不同年龄和重量的儿童选购不同型号的产品.就此,我想告诉您一些关于儿童汽车安全座椅的相关知识.毕竟孩子是当父母的命根子.。
(1)婴儿汽车安全座椅(新生儿到9个月):适用群为从新生儿到9公斤或20磅大的婴儿(一般为9个月大)。婴儿汽车安全座椅一般都装有可摇摆的底部,在朋友家、饭馆等地方让孩子得以放松。这种座椅还有把手,可作手提篮用。如果您使用的是婴儿汽车安全座椅,孩子长大一点后,您还得另买一个较大的座椅。尽管如此,约三分之二的父母还是购买婴儿汽车安全座椅,因为它还具有摇动、便携的功能。有些婴儿汽车安全座椅还可与手推车配合使用,这样就不会在手推车和汽车之间出入弄醒熟睡的婴儿,设计非常灵活。
(2)新生儿到4岁儿童的汽车安全座椅:其设计同时提供两种功能:先用于新生儿到9个月的婴儿,然后改成用于9个月的婴儿到体重18公斤或 40 lbs(一般为4岁)的儿童。这种座椅虽然没有摇摆、便携以及与手推车合用的功能,但可固定在车内并能长久使用。如果您想省点钱的话,它就是最佳选择。
(3)9个月到4岁儿童的汽车安全座椅 :这款儿童用汽车安全座椅,设计简单,没有前者座椅那么多的复杂的功能,适合大的幼儿使用。
(4)9个月到6岁儿童的汽车安全座椅:这款安全座椅是一种有趣的组合产品,既是一种专为蹒跚学步儿童(年龄从9个月到4岁)准备的座椅,又可拆除座椅本的安全带而直接使用大人的安全带,可用至6岁。您亦无需更换其它汽车安全座椅垫了。这种产品的缺点在于,9个月和5岁的儿童个头差别相当大,所以有些父母会觉得对较小婴儿来说不会太舒适。
(5)汽车安全座椅垫(适用于3、4岁到6岁儿童):汽车安全座椅垫是不可缺少的!小孩到4岁以后,许多父母认为孩子可以不再使用汽车安全座椅座垫了。但研究结果表明,小孩的身体太小,即使用了成人安全带,如果发生意外,仍会非常危险。汽车安全座椅垫通常不贵,父母不该在这上面节省。
【注】:切记新生儿到6岁儿童都应采用任何一款恰当的汽车安全座椅,至于选择哪种,视个人需要而定。
汽车安全座椅是一件保护婴儿安全的重要用具。亚洲的许多国家还没有关于汽车安全座椅的立法,或者立法不严格。请您多加注意,选用通过国际安全标准的汽车安全座椅。
一、按体重选购
体重不足9千克,并且未足1岁:可使用后向式婴儿安全座椅;视乎婴儿身形,亦可选用汽车手提篮。
9至18千克的1至4岁幼儿: 可使用前向式儿童安全座椅。
15至36千克的4至11岁儿童:可用安全坐垫,并扣上汽车安全带。
二、家长选购三考量
(一)安全考量
1.符合婴幼儿的年龄、体型及身高。
2.适合家中汽车座位的形状。
3.结构牢固。
4.易于安装,以减少误用的可能性。
5.具备安全带固定设备。
6.安全带有瞬间紧缩装置,危险发生时,能及时拉住婴幼儿免受伤害。
7.安全座椅的倾斜角度可随着婴幼儿的成长做调整,最好有矫正仪器提供建议,以确保安全。
8.高度不要太高,愈高幼童重心愈不稳。
9.愈大且愈平的底部,稳固性与保护性愈大。
10.椅背必须较婴幼儿背部高,才能保护头部和颈部。
11.有详细的中文使用说明书。
12.通过标准检验局安全认证,并印有商品检验合格标志。
(二)舒适考量
1.座椅的材质舒适、通气且易于拆洗。
2.针对新生儿提供保护头部的护垫。
3.不需调整安全带就能调整角度,以免惊扰睡眠中的婴幼儿。
4.安全带支撑部位的材质须为柔软材质,以避免婴幼儿擦伤。
(三)经济考量
安全座椅价格差异大,须多做比较、了解,以选择适合的型号。
汽车安座椅安装须知
家长可别以为有了儿童安全座椅,婴幼儿乘车的安全救无需操心。根据调查发现儿童安全座椅的使用不当,反而会增加婴幼儿受伤的风险,所以提醒使用安全座椅的家长一些该注意的小地方:
1.婴儿用卧床应朝后放置(面向车尾而背朝前),以保护头、颈部。
2.检视婴儿用卧床手柄的坚固性,避免手柄断落而使婴幼儿受伤。
3.安全座椅应装置于后座,以避免冲撞时安全气囊强力推挤而受伤。
4.安全座椅应依使用说明书安装,安装完毕后应实际操作一次,并用力摇晃看看是否会左右晃动。
5.检查安全带位置适否适当,以及是否系紧。
6.安全座椅应妥善放置,不可摆放于高处,以避免掉落而使婴幼儿受伤。
7.若孩子将安全带解开了,应立即将车子停到安全的地方,重新系好才可以发动车子。
8.父母应教导孩子正确的行车安全观念,并以身作则系好安全带,切勿因孩子哭闹而违反安全原则。
安全座椅使用前,应该仔细阅读说明书。安装儿童座椅最好的位置是后座中间,因为研究发现这是最安全的位置。尤其是加装安全气囊的座位。已有数百起意外事故伤害报告,是因前座气囊不慎爆开,造成孩童头颈部受伤。 小孩和安全座椅,最好都放在后座。医学报告显示,后座固定良好,受伤机率小。
装置安全座椅需要花一点心思和时间,任何对象的松脱,都会影响保护效果。譬如前向或后向的安全座椅,若是装反,自然无法达到保护效果。且安装座椅时要留意「对」的角度,安装后可以左右上下摇晃,看看是否稳固。一般左右位移应不超过一吋(约两指宽度)。将孩子固定在座位上后,确认孩子身上绑的安全带有无扭转翻面情形,安全带的松紧以可容下一指才算合格。
此外,幼童座椅的肩带要穿过胸前到大腿固定,而非卡在腰或肚子上,美国消费者产品委员会(CPSC)建议。幼儿安全座椅的胸扣应在腋下高度的位置;使用学童用座椅时,记得肩带和腿带要一起系好,才能有保护效果。
婴幼儿乘车安全实例讲解
一个七天的长假,许多家庭在驾车出行中充分享受了天伦之乐,人们都说节日是为孩子而准备的,因为只有他们才会完全地做到无忧无虑,可以在海之涯欣赏朝阳的蓬勃;也可以在山之巅品味落日的余光。可当孩子乘车出行成为普遍现象之后,我们就不免担忧起来,因为大部分的家长还没有重视到孩子乘车的安全问题,比如儿童安全座椅、无安全座椅时的安全乘坐位置。
或许宝宝出生前,你就已经为他准备好安全舒适的婴儿安全座椅,经常抱着进出,也很小心地研读使用说明,驾车时自然会注意在座车上安全座椅的安放并将宝宝系紧。提醒爸爸妈妈,当宝宝还未超过约10公斤,在放置婴儿安全座椅时,不要将宝宝面向前摆在后座,以免刹车时向前倾倒造成危险。因为此时宝宝还不能控制自己的颈部肌肉和位置,只需平放用安全带系紧。将宝宝放在司机斜后方的位置最好,既安全又可以随时互动。
宝宝更大一些,能够背靠着支撑物直坐起来,躺椅也就不再使用。他需要的是一张直立式安全座椅。直立式的座椅较高,宝宝也可以藉此转头看看窗外风景。出门前,在车上后座安置婴儿安全座椅,并测试是否安稳,安全带是否松紧适宜。有些座椅的设计需要调整倾斜度,或者加装锁扣,爸爸千万不可怕麻烦或大意。
大一些学步期的宝宝,或许就不喜欢这些汽车安全座椅装备,因为这对好动的幼儿来说,确实是一种限制。但行车安全仍是必须坚守的,车上原有给成人系的安全带也不见得适合使用。爸爸可以和孩子一同挑选他所喜欢、较为简单的小坐垫安全座椅,将孩子垫高再系上原车的安全带,随时留意车身晃动时,安全带会不会因此压到孩子的脖子或脸颊,以免在途中被安全带困住。
学龄期儿童已经够大,可以系上安全带了。切记,只要这样一个小动作就能减少百分之九十的车祸死亡率。通常后座安全带会有上下两条带子,上面的斜在胸前,下面的系在大腿上,位置要正确。有些安全带会自动系紧,有些不会,爸妈应引导孩子把安全带系紧,如果只有一条在下面,仍然可以系住腿部,减少头部碰撞的机会,还是会比较安全的,千万不可以因为这样就不系安全带。有些车子有安全气囊,如果在没有安全带的情况下直接冲撞,很可能会因安全气囊爆开而伤害眼睛呢!或者你想让孩子自己坐前排,这往往也是他们自己的要求。不过一般汽车前座是根据大人的体格设计的,小孩子的身高体重和大人相差甚多,所以安全带是无法发挥正常功能的。无论如何还是让孩子坐后座吧!
假日休闲,全家一同带着宝宝开车上街,是一家人经常的集体活动,有自己的车当然很方便,也是爸爸妈妈们感到很有成就感的事。不论你们到郊外散心、到购物中心或游乐场,可别忽略安全问题。请别忘了,先准备好娃娃汽车安全座椅!最常见的情况是爸爸开车,妈妈抱着比较小的BB坐在前座。可是有没有想过,万一后面车子刹车出问题,或是万一有不守规矩的司机闯红灯,会发生什么样的事情..您知道吗?在时速五十公里左右的时候,如果没有任何安全防护,坐前座的小孩碰撞仪表板的强度相当于从三楼摔下来!你或许想说,小孩有我抱着不会有问题,我一定会保护他。然而请您想想,如果抱着小孩子却没有系上安全带,意外发生时你绝对来不及控制自己身体的冲力,结果小孩子还要成为你的安全气囊!带婴幼儿乘车时应使用儿童座椅。大人抱着孩子乘车是非常危险的,当汽车在40公里时速下发生碰撞时,大人手臂上的负荷会猛增到相当于孩子体重30倍的重量。假设孩子的体重为10g,在碰撞的一瞬间将达到300kg,这时无论大人抱得多紧也无法确保孩子不摔出去。因此不管孩子多么不愿意,也应该坚持使用儿童座椅并让孩子逐渐去适应。如果小孩还不满四岁,最好使用合格的安全座椅,因为这才是依照孩子的体型设计的,在四面八方的冲撞下都能保护小孩。
当女性开车不再特别时,就意味着孩子乘车的机会将大大地增多,于是我们经常看到一位母亲开着车,小孩儿自由地坐在副驾驶位置上或者一位成人抱着孩子坐在副驾驶的位置上,而这种普遍的现象却恰恰是一个误区,孩子的这种自由也恰恰是一种潜在的危机。虽然汽车仍旧没有普及,但孩子乘车的几率却不断增高。也许在您的脑海中没有儿童安全产品这个概念,但这只能说明我们观念的落后而不能否认它的重要性。
讲了这么多,只为了提醒您:不管您多想跟孩子靠近一点、多想抱着孩子一起兜风,让孩子坐安全座椅和系安全带是很重要的,要亲近请等回到家或到达目的地之后再说吧!
EXT2FS第二代扩展文件系统(英语:second extended filesystem,缩写为 ext2),是LINUX内核所用的文件系统。它开始由Rémy Card设计,用以代替ext,于1993年1月加入linux核心支持之中。ext2 的经典实现为LINUX内核中的ext2fs文件系统驱动,最大可支持2TB的文件系统,至linux核心2.6版时,扩展到可支持32TB。其他的实现包括GNU Hurd,Mac OS X (第3方),Darwin (第3方),BSD。ext2为数个LINUX发行版的默认文件系统,如Debian、Red Hat Linux等 。
简介
其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 16384GB。
但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,实际上能使用的文件系统容量最多也只有 2048GB。
至于Ext3文件系统,它属于一种日志文件系统,是对ext2系统的扩展。它兼容ext2,并且从ext2转换成ext3并不复杂。
Ext2文件系统具有以下一般特点:
1、当创建Ext2文件系统时,系统管理员可以根据预期的文件平均长度来选择最佳的块大小(从1024B——4096B)。例如,当文件的平均长度小于几千字节时,块的大小为1024B是最佳的,因为这会产生较少的内部碎片——也就是文件长度与存放块的磁盘分区有较少的不匹配。另一方面,大的块对于 大于几千字节的文件通常比较合合适,因为这样的磁盘传送较少,因而减轻了系统的开销 [1] 。
2、当创建Ext2文件系统时,系统管理员可以根据在给定大小的分区上预计存放的文件数来选择给该分区分配多少个索引节点。这可以有效地利用磁盘的空间。
3、文件系统把磁盘块分为组。每组包含存放在相邻磁道上的数据块和索引节点。正是这种结构,使得可以用较少的磁盘平均寻道时间对存放在一个单独块组中的文件并行访问。
4、在磁盘数据块被实际使用之前,文件系统就把这些块预分配给普通文件。因此当文件的大小增加时,因为物理上相邻的几个块已被保留,这就减少了文件的碎片。
5、支持快速符号链接。如果符号链接表示一个短路径名(小于或等于60个字符),就把它存放在索引节点中而不用通过由一个数据块进行转换。
Ext2还包含了一些使它既健壮又灵活的特点:
1、文件更新策略的谨慎实现将系统崩溃的影响减到最少。我们只举一个例子来体现这个优点:例如,当给文件创建一个硬链接时,首先增加磁盘索引节点中 的硬链接计数器,然后把这个新的名字加到合适的目录中。在这种方式下,如果在更新索引节点后而改变这个目录之前出现一个硬件故障,这样即使索引节点的计数 器产生错误,但目录是一致的。因此,尽管删除文件时无法自动收回文件的数据块,但并不导致灾难性的后果。如果这种处理的顺序相反(更新索引节点前改变目 录),同样的硬件故障将会导致危险的不一致,删除原始的硬链接就会从磁盘删除它的数据块,但新的目录项将指向一个不存在的索引节点。如果那个索引节点号以 后又被另外的文件所使用,那么向这个旧目录的写操作将毁坏这个新的文件。
2、在启动时支持对文件系统的状态进行自动的一致性检查。这种检查是由外部程序e2fsck完成的,这个外部程序不仅可以在系统崩溃之后被激活,也 可以在一个预定义的文件系统安装数(每次安装操作之后对计数器加1)之后被激活,或者在自从最近检查以来所花的预定义时间之后被激活。
3、支持不可变(immutable)的文件(不能修改、删除和更名)和仅追加(append-only)的文件(只能把数据追加在文件尾)。
4、既与Unix System V Release 4(SVR4)相兼容,也与新文件的用户组ID的BSD语义相兼容。在SVR4中,新文件采用创建它的进程的用户组ID;而在BSD中,新文件继承包含它 的目录的用户组ID。Ext2包含一个安装选项,由你指定采用哪种语义。
即使Ext2文件系统是如此成熟、稳定的程序,也还要考虑引入另外几个负面特性。目前,一些负面特性已新的文件系统或外部补丁避免了。另外一些还仅仅处于计划阶段,但在一些情况下,已经在Ext2的索引节点中为这些特性引入新的字段。最重要的一些特点如下:
块片(block fragmentation)
系统管理员对磁盘的访问通常选择较大的块,因为计算机应用程序常常处理大文件。因此,在大块上存放小文件就会浪费很多磁盘空间。这个问题可以通过把几个文件存放在同一块的不同片上来解决。
透明地处理压缩和加密文件
这些新的选项(创建一个文件时必须指定)将允许用户透明地在磁盘上存放压缩和(或)加密的文件版本。
逻辑删除
一个undelete选项将允许用户在必要时很容易恢复以前已删除的文件内容。
日志
日志避免文件系统在被突然卸载(例如,作为系统崩溃的后果)时对其自动进行的耗时检查。
实际上,这些特点没有一个正式地包含在Ext2文件系统中。有人可能说Ext2是这种成功的牺牲品;直到几年前,它仍然是大多数Linux发布公司采用的首选文件系统,每天有成千上万的用户在使用它,这些用户会对用其他文件系统来代替Ext2的任何企图产生质疑。
Ext2中缺少的最突出的功能就是日志,日志是高可用服务器必需的功能。为了平顺过渡,日志没有引入到Ext2文件系统;但是,我们在后面 “Ext3文件系统”中会讨论,完全与Ext2兼容的一种新文件系统已经创建,这种文件系统提供了日志。不真正需要日志的用户可以继续使用良好而老式的Ext2文件系统,而其他用户可能采用这种新的文件系统。现在发行的大部分系统采用Ext3作为标准的文件系统。
Linux支持多种不同类型的文件系统:网络文件系统NFS,磁盘文件系统Extfs,特殊文件系统proc、tmpfs等。
Ext2fs文件系统基本概念
Inode
Ext2fs中,每个文件都用如下图所示的inode结构来描述,用户空间操作的对象是文件路径和名称,系统kernel把路径名称解析成inode,通过inode号来访问它代表的文件。
Mode:包含两个数据,文件类型(普通文件/目录/字符设备/块设备/符号链接/管道)和用户访问权限信息(0660)。
Owner info:文件属组信息。
Size:文件长度,单位是byte。
Timestamps:文件访问和修改的时间戳。
Links count:这个项在上图中没有体现,它记录了这个inode存在多少个链接,创建新文件时,其inode的links count应该为1,文件被删除后,这个inode的links count就变为0。
Data Blocks:指向真实的文件数据块,因为大文件可能会分配很多的block,直接在inode中保存所有的数据块指针将会比较困难,也会浪费掉很多空间,毕竟系统中大文件的数量是占少数的,所以设计了间接块指针(Indirect blocks)和二级块指针(Double blocks)来指向真实数据块。
实际上还应该包含了inode号。
目录
在Ext2fs中,目录被看做一种特殊文件,也用一个inode来描述,目录的data block中保存了目录下的所有内容,每条内容叫做一个entry,结构如下:
每条entry都保存了inode号、entry的长度、文件名长度、文件类型,并且都是4字节对齐。
特别地,每个目录下有两个特殊的子目录,'.'和'..',分别代表当前目录和上一级目录,这两个目录文件其实是硬链接。其中'..'有一个重要的作用:FS checker(可以把文件系统umount后手动执行e2fsck看看)在检查文件系统的时候,就会使用’..‘来检查目录是否可以追溯到挂载根目录,如果检查失败,目录便会被链接到挂载根目录下面的lost+found。
链接
为了方便系统内文件共享,Linux支持了两种基本的链接文件:硬链接和软链接(也叫符号链接)。
硬链接并不是一个独立的文件,不占用inode,只是在目录下创建了一条entry,其中inode号保存的是目标文件的inode号,访问硬链接时,文件系统通过inode将访问操作重定向到目标文件,实现了文件共享,所以硬链接就是多个文件名直接指向同一个inode,用stat命令也能看到其inode号就是目标文件的inode号,它的特点:
不能跨文件系统。
目标文件必须先存在(inode存在且link count不为0)。
只能对普通文件创建硬链接,目录不行。
删除一个硬链接文件并不影响其他有相同 inode 号的文件。
软链接是一个独立的文件,拥有自己的inode,其数据块存放的是目标文件的名称,访问软链接时,kernel先访问软链接的内容,拿到目标文件名,并重新启动路径解析,获取到目标文件inode号再向文件系统发起访问。软链接的特点:
可以跨文件系统。
文件和目录都可以。
可对不存在的文件或目标创建软链接。
软链接有自己文件属性和权限。
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
软链接的目标文件也可以是软链接,其解析过程是递归的。
注意:软链接创建时目标文件的路径指向使用绝对路径比较好,使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接,因为链接数据块中记录的也是相对路径指向。
下面这个图清晰描述了硬链接和软连接之间的区别:
Ext2fs基本结构
在创建文件系统的时候,Ext2fs将设备(磁盘或者分区)划分成1K、2K或者4K的block,然后通过Block group来管理,Ext2fs/Ext3fs/Ext4fs的结构差不多(Ext2fs主要是少了日志功能相关的内容),大致如下图所示:
Super Block
Super Block是文件系统最重要的数据,它从设备开始位置偏移1024字节的地方开始存储,占用1个block。如果block的大小是1KB,那么Super Block就存放在block-1。如果block的大小是4KB,那Super block就存放在block-0。
在Ext2fs的第一个版本(reverson0),每个Block Group都会存储一份Super Block的一份副本,因为对空间浪费比较严重,后来的版本就只在部分Block Group(0、1、3、5、7、9这几个group)中保留了Super Block的副本,在这几个Group,和Super Block一起备份的还有Group Descriptor。当然,如果没有这么多Group,副本数量自然更少,在后面的demo中也可以看出来。其中Group-0中的Super Block叫作Primary Super Block,文件系统被mount时,VFS读取的也正是这份。
Super Block里面的具体数据包括:
inode和block的总数,以及还有多少未分配。
每个Block Group有多少个inode和block。
文件系统唯一身份标识符(UUID),每个设备上的文件系统UUID都不一样。
...
GDT
Group Descriptor Table,GDT在文件系统中的layout紧跟Super block后面,是文件系统第二关键的数据,它主要用于存放所有Block Group的信息:。
Ext2fs为GDT预留了一部分空间,用于文件系统扩容。
通过冗余提高了文件系统可靠性:在多个group中保存了关键数据的冗余副本,包括super block、GDT,当这些关键数据损坏的时候,很容易从这些冗余副本中恢复。
提升性能:分成group后,inode table和data block之间的”距离“变近了,在执行I/O时,可能会减少磁头寻址的时间。
注:实际上inode size,每个group中的block数等参数都可以在创建文件系统的时候指定,具体命令参数参考man page。
Ext2fs的性能优化
为了提升I/O性能,Ext2fs内核代码也做了很多设计,其中有两个关键的技术:
提前读:当必须读取一个块时,内核代码在几个连续的块上请求I/O。通过这种方式,它试图确保要读取的下一个块已经加载到缓冲区缓存中。提前读通常在文件的连续读取期间执行,Ext2fs将它们扩展到目录读取,可以是显式读取(readdir(2)调用),也可以是隐式读取(namei内核目录查找)。
预分配:在将数据写入文件时,Ext2fs在分配新块时预先分配最多8个相邻块。具体预分配多少个块取决于block size:block size = 1KB,每次预分配2个block;block size = 2KB,每次预分配4个block;block size = 4KB,每次预分配8个block。当然,对于用touch创建的空文件是不会预分配block的。即使在非常满的文件系统上,预分配命中率也只有75%左右。这种预分配在负载较大的情况下可以获得良好的写性能,同时它还允许将连续的块分配给文件,从而加快未来的顺序读取。
下面是Ext2fs、Ext3fs和Ext4fs的一个简单对比:
只有Ext2fs的Filesystem state是not clean,Ext3fs和Ext4fs都是clean,Ext2fs刚被以读写模式mount时,这个state被设置成not clean,umount或者以只读模式mount时,state被设置成clean,启动时文件系统根据这个状态来决定是否要执行检查。
Ext3fs/Ext4fs的Super block中多了关于日志功能的信息。
Ext4fs的每个group多了校验和(checksum)数据。
channel-group 0 unframed 。
0 号通道采用非成帧模式封装数据。
从专业上来讲:
E1非成帧,每个E1有32个时隙,TS0--TS31.每个时隙速率为64Kbps,每个E1(通常说的2M) 64*32=2048Kbps.。
E1成帧,即TS0用于帧同步,不可承载用户数据.那么成帧情况下,FE1最大速率为64*31=1984Kbps.当然可以部分时隙捆绑,典型接口应用如PRI.还有一种PCM30成复帧模式,用户可用时隙数量为30,TS0和TS16不可用,TS16用来传输信令,典型应用语音话路中继,这就是一条E1只能传输30路语音的缘由.。
UTF8并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较:
以"I am Chinese"为例。
用ANSI储存:12 Bytes。
用Unicode/UCS2储存:24 Bytes + 2 Bytes(header)。
用UCS4储存:48 Bytes + 4 Bytes(header)。
以"我是中国人"为例
用ANSI储存:10 Bytes。
用Unicode/UCS2储存:10 Bytes + 2 Bytes(header)。
用UCS4储存:20 Bytes + 4 Bytes(header)。
由此可见直接以Unicode/UCS的原始形式来储存是一种极大的浪费,而且也不利于互联网的传输(中文稍为合算一点^_^)。
有见及此,Unicode/UCS的压缩形式--UTF8出现了,套用官方网站的首句话『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于UTF也适用于编码UCS,故亦可称为『UCS transformation formats (UTF)』
UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。
编码原理
先看这个模板:
UCS-4 range (hex.) UTF-8 octet sequence (binary)。
0000 0000-0000 007F 0xxxxxxx。
0000 0080-0000 07FF 110xxxxx 10xxxxxx。
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx。
0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx。
编码步骤:
1) 首先确定需要多少个8bits(octets)。
2) 按照上述模板填充每个octets的高位bits。
3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x。
4) 解码的原理一样。
实例:(留意每个bit的颜色,粗体字为模板内容)。
UCS-4 UTF-8
HEX BIN Bytes BIN HEX Bytes 。
0000 000A 00001010 4 00001010 0A 1 。
0000 0099 10011001 4 11000010 10011001 C2 99 2 。
0000 8D99 10001101 10011001 4 11101000 10110110 10011001 E8 B6 99 3 。
不知大家看懂了没有,其实不懂也无所谓,反正又不用自己算,程式可以完全代劳。
以UTF8格式储存的文件档首标识为EF BB BF。
效率
从上述编码原理中得出的结论是:
1.每个英文字母、数字所占的空间为1 Byte;
2.泛欧语系、斯拉夫语字母占2 Bytes;
3.汉字占3 Bytes。
由此可见UTF8对英文来说是个非常诱人的方案,但对中文来说则不太合算,无论用ANSI还是 Unicode/UCS2来编码都只用2 Bytes,但用UTF8则需要3 Bytes。
以下是一些统计资料,显示用UTF8来储存文件每个字符所需的平均字节:
1.拉丁语系平均用1.1 Bytes;
2.希腊文、俄文、阿拉伯文和希伯莱文平均用1.7 Bytes;
3.其他大部份文字如中文、日文、韩文、Hindi(北印度语)用约3 Bytes;
4.用超过4 Bytes的都是些非常少用的文字符号。
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。
Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standard,目前第五版由Addison-Wesley Professional出版,ISBN-10: 0321480910)对外发表。
2006年6月的最新版本的 Unicode 是 2005年3月31日推出的Unicode 4.1.0 。另外,5.0 Beta已于2005年12月12日推出,以供各会员评价。
[编辑本段]Unicode 的编码和实现。
大概来说,Unicode 编码系统可分为编码方式和实现方式两个层次。
1.编码方式
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
Unicode字符集可以简写为UCS(Unicode Character Set)。早期的Unicode标准有UCS-2、UCS-4的说法。UCS-2用两个字节编码,UCS-4用4个字节编码。UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。
每个平面有2^16=65536个码位。Unicode计划使用了17个平面,一共有17*65536=1114112个码位。在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。
平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。代理区的目的用两个UTF-16字符表示BMP以外的字符。在介绍UTF-16编码时会介绍。
如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2408=99089。余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,它们对应着Unicode目前定义的99089个字符,其中包括71226个汉字。平面0、平面1、平面2和平面14上分别定义了52080、3419、43253和337个字符。平面2的43253个字符都是汉字。平面0上定义了27973个汉字。
2.实现方式
在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码。
WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码。
DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码。
这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个WORD,大小是4个字节。“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。
UTF-8
UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(16进制) ║ UTF-8 字节流(二进制) 。
000000 - 00007F ║ 0xxxxxxx 。
000080 - 0007FF ║ 110xxxxx 10xxxxxx 。
000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx 。
010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 。
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用用4字节模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。
UTF-16
UTF-16编码以16位无符号整数为单位。我们把Unicode编码记作U。编码规则如下:
如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
为什么U'可以被写成20个二进制位?Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示。例如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。
按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个WORD的高6位是110111。可见,第一个WORD的取值范围(二进制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二个WORD的取值范围(二进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。
为了将一个WORD的UTF-16编码与两个WORD的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来,并称为代理区(Surrogate):
D800-DB7F ║ High Surrogates ║ 高位替代 。
DB80-DBFF ║ High Private Use Surrogates ║ 高位专用替代 。
DC00-DFFF ║ Low Surrogates ║ 低位替代。
高位替代就是指这个范围的码位是两个WORD的UTF-16编码的第一个WORD。低位替代就是指这个范围的码位是两个WORD的UTF-16编码的第二个WORD。那么,高位专用替代是什么意思?我们来解答这个问题,顺便看看怎么由UTF-16编码推导Unicode编码。
如果一个字符的UTF-16编码的第一个WORD在0xDB80到0xDBFF之间,那么它的Unicode编码在什么范围内?我们知道第二个WORD的取值范围是0xDC00-0xDFFF,所以这个字符的UTF-16编码范围应该是0xDB80 0xDC00到0xDBFF 0xDFFF。我们将这个范围写成二进制:
1101101110000000 11011100 00000000 - 1101101111111111 1101111111111111。
按照编码的相反步骤,取出高低WORD的后10位,并拼在一起,得到。
1110 0000 0000 0000 0000 - 1111 1111 1111 1111 1111。
即0xe0000-0xfffff,按照编码的相反步骤再加上0x10000,得到0xf0000-0x10ffff。这就是UTF-16编码的第一个WORD在0xdb80到0xdbff之间的Unicode编码范围,即平面15和平面16。因为Unicode标准将平面15和平面16都作为专用区,所以0xDB80到0xDBFF之间的保留码位被称作高位专用替代。
UTF-32
UTF-32编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。
字节序
根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。例如:
Unicode编码 ║ UTF-16LE ║ UTF-16BE ║ UTF32-LE ║ UTF32-BE 。
0x006C49 ║ 49 6C ║ 6C 49 ║ 49 6C 00 00 ║ 00 00 6C 49 。
0x020C30 ║ 43 D8 30 DC ║ D8 43 DC 30 ║ 30 0C 02 00 ║ 00 02 0C 30 。
那么,怎么判断字节流的字节序呢?Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符"零宽无中断空格"。这个字符的编码是FEFF,而反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不应该出现在实际传输中。下表是各种UTF编码的BOM:
UTF编码 ║ Byte Order Mark 。
UTF-8 ║ EF BB BF 。
UTF-16LE ║ FF FE 。
UTF-16BE ║ FE FF 。
UTF-32LE ║ FF FE 00 00 。
UTF-32BE ║ 00 00 FE FF。
[编辑本段]非 Unicode 环境。
在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode 编码。可以在“语言与区域设置”中选择一个代码页作为非 Unicode 编码所采用的默认编码方式,如936为简体中文GBK,950为正体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。从根本上说,完全采用统一编码才是解决之道,但目前上无法做到这一点。
代码页技术现在广泛为各种平台所采用。UTF-7 的代码页是65000,UTF-8 的代码页是65001。
[编辑本段]XML 和 Unicode。
XML及其子集HTML采用UTF-8作为标准字集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的网页,只要电脑本身安装有合适的字体即可。可以利用nnn;的格式显示特定的字符。nnn代表该字符的十进制 Unicode 代码。如果采用十六进制代码,在编码之前加上x字符即可。但部分旧版本的浏览器可能无法识别十六进制代码。
然而部分由于 Unicode 版本发展原因,很多浏览器只能显示 UCS-2 完整字符集也即现在使用的 Unicode 版本中的一个小子集。下表可以检验您的浏览器怎样显示各种各样的 Unicode 代码:
代码 字符标准名称 (英语) 在浏览器上的显示 。
A大写拉丁字母"A" A 。
szlig; 小写拉丁字母"Sharp S" ß 。
thorn; 小写拉丁字母"Thorn" þ 。
Δ大写希腊字母"Delta" Δ 。
Й 大写斯拉夫字母"Short I" Й 。
ק希伯来字母"Qof" ק 。
م阿拉伯字母 "Meem" م 。
๗泰文数字 7 ๗
ቐ埃塞俄比亚音节文字"Qha" ቐ 。
あ日语平假名 "A" あ 。
ア日语片假名 "A" ア 。
叶简体汉字 "叶" 叶
叶 繁体汉字 "叶" 叶 。
엽韩国音节文字 " Yeob" 엽。
[编辑本段]输入Unicode。
除了输入法外,操作系统会提供几种方法输入Unicode。像是Windows 2000之后的Windows系统就提供一个可点击的表。例如在Microsoft Word或者金山WPS之下,按下 Alt 键不放,输入 0 和某个字符的 Unicode 编码(十进制),再松开 Alt 键即可得到该字符,如Alt + 033865会得到Unicode字符“叶”(繁体)。另外按Alt + X 组合键,MS Word 也会将光标前面的字符同其十六进制的四位 Unicode 编码进行互相转换。
Unicode 编码表反弹。
0000-0FFF 8000-8FFF 10000-10FFF 20000-20FFF 28000-28FFF 。
1000-1FFF 9000-9FFF 21000-21FFF 29000-29FFF 。
2000-2FFF A000-AFFF 22000-22FFF 2A000-2AFFF 。
3000-3FFF B000-BFFF 23000-23FFF 。
4000-4FFF C000-CFFF 1D000-1DFFF 24000-24FFF 2F000-2FFFF 。
5000-5FFF D000-DFFF 25000-25FFF 。
6000-6FFF E000-EFFF 26000-26FFF 。
7000-7FFF F000-FFFF 27000-27FFF E0000-E0FFF。
Unicode 目前已经有5.0版本。世界上有一大批计算机、语言学等科学家专门研究Unicode,到了现在Unicode标准已经不单是一个编码标准,还是记录人类语言文字资料的一个巨大的数据库,同时从事人类文化遗产的发掘和保护工作。
对于中文而言,Unicode 16编码里面已经包含了GB18030里面的所有汉字(27484个字),目前Unicode标准准备把康熙字典的所有汉字放入到Unicode 32bit编码中。
简单地说,Unicode扩展自ASCII字元集。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。Unicode最初打算作为ASCII的补充,可能的话,最终将代替它。考虑到ASCII是电脑中最具支配地位的标准,所以这的确是一个很高的目标。
Unicode影响到了电脑工业的每个部分,但也许会对作业系统和程序设计语言的影响最大。从这方面来看,我们已经上路了。Windows NT从底层支持Unicode(不幸的是,Windows 98只是小部分支援Unicode)。先天即被ANSI束缚的C程序设计语言通过对宽字元集的支持来支持Unicode。
[编辑本段]为什么使用Unicode?
基本上,计算机只是处理数字。它们指定一个数字,来储存字母或其他字符。在创造Unicode之前,有数百种指定这些数字的编码系统。没有一个编码可以包含足够的字符:例如,单单欧州共同体就[1][2]需要好几种不同的编码来包括所有的语言。即使是单一种语言,例如英语,也没有哪一个编码可以适用于所有的字母,标点符号,和常用的技术符号。这些编码系统也会互相冲突。也就是说,两种编码可能使用相同的数字代表两个不同的字符,或使用不同的数字代表相同的字符。任何一台特定的计算机(特别是服务器)都需要支持许多不同的编码,但是,不论什么时候数据通过不同的编码或平台之间,那些数据总会有损坏的危险。
GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。 Microsoft简体版中文Windows 95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。
GB码,全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。
GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
GBK码对字库中偏移量的计算公式为:
[(GBKH-0xB0)*0x5E+(GBKL-0xA1)]*(汉字离散后每个汉字点阵所占用的字节)。