怎样解析打造UCS瑞士军刀.docVIP

  1. 1、本文档被系统程序自动判定探测到侵权嫌疑,本站暂时做下架处理。
  2. 2、如果您确认为侵权,可联系本站左侧在线QQ客服请求删除。我们会保证在24小时内做出处理,应急电话:400-050-0827。
  3. 3、此文档由网友上传,因疑似侵权的原因,本站不提供该文档下载,只提供部分内容试读。如果您是出版社/作者,看到后可认领文档,您也可以联系本站进行批量认领。
查看更多
打造UCS瑞士军刀 Unicode是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是Universal Multiple-Octet Coded Character Set”,简称为UCS。UCS可以看作是Unicode Character Set”的缩写。U+D800到U+DBFF之间,低位代理的取值范围在U+DC00到U+DFFF之间。由于高低代理的取值范围是前后相接的,所以合并起来得到U+ D800到U+DFFF这个“代理取值范围”。 在字符串中,凡是取值在U+ D800到U+DFFF之外的编码单元就是BMP字符,否则就是代理对编码单元。 在字符串中,代理必须成对给出,不可分割。也就是说,高位代理的后面必须是一个低位代理,低位代理的前面必须是一个高位代理;高位代理的前面不能是一个高位代理,低位代理的后面不能是一个低位代理。 因此在UTF-16字符串中,如果要对代理对提供完整支持的话,至少应该实现以下几个基本功能: 在字符串中判断某个位置上的编码单元的类型(即是无效编码单元、BMP字符、高位代理还是低位代理)。 把编码点转换为UTF-16字符串。 计算UTF-16字符串中指定位置上的编码单元所属的那个字符的编码点。 把代理对转换为编码点。 编码点转换为代理对。 编码单元类型识别 原理:很简单,根据前面总结的几条代理对机制基本元素,就可以编写出相应的识别算法了。 编程: // 判断UTF-16编码格式字符串中指定位置编码单元的类型: // 0 表示 无效编码单元 // 1 表示 BMP字符 // 2 表示 高位代理 // 3 表示 低位代理 function UTF16CodeUnitType(UTF16Str:PWideChar;Index:integer):integer; stdcall; var UTF16Code:Word; begin if (UTF16Strnil) and (UTF16Str^#0) then begin UTF16Code:=Ord(UTF16Str[Index-1]); if (UTF16Code=$D800) and (UTF16Code=$DFFF) then begin if UTF16Code=$DBFF then begin if UTF16Str[Index]#0 then begin UTF16Code:=Ord(UTF16Str[Index]); if (UTF16Code=$DC00) and (UTF16Code=$DFFF) then Result:=2 else Result:=0 end else Result:=0 end else if Index1 then begin UTF16Code:=Ord(UTF16Str[Index-2]); if (UTF16Code=$D800) and (UTF16Code=$DBFF) then Result:=3 else Result:=0 end else Result:=0 end else Result:=1 end else Result:=0 end; 把编码点转换为UTF-16字符串 原理:因为代理对由前后两个代理组成,所以根据高低代理取值范围的定义,可以很容易地计算出代理对可以表示的增补字符总数=(0xDBFF-0xD800+1)*(0xDFFF-0xDC00+1)=1048576。而在Unicode标准里面,每个字符平面的大小是65536,由于1048576/65536=16,所以增补字符平面总共有16个。所有增补字符的Unicode编码点取值范围在U+10000到U+10FFFF之间,其中第一个增补平面在U+10000到U+1FFFF之间;第二个增补平面在U+20000至U+2FFFF之间;……第十六个增补平面在U+100000到U+10FFFF之间。 对于把编码点转换为UTF-16字符串的工作来说,如果是BMP编码点的话很简单,编码点的值就等于UTF-16编码单元的值。关键部分在于增补字符也就是增补编码点如何转换为代理对的问题。既然已经知道代理对由前后两个代理编码单

文档评论(0)

aa15090828118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档