收藏 分享(赏)

YDT - 基于国际多语种域名体系的中文域名的编码处理技术要求.docx

上传人:oceanpvg 文档编号:5663334 上传时间:2019-03-11 格式:DOCX 页数:61 大小:133.58KB
下载 相关 举报
YDT - 基于国际多语种域名体系的中文域名的编码处理技术要求.docx_第1页
第1页 / 共61页
YDT - 基于国际多语种域名体系的中文域名的编码处理技术要求.docx_第2页
第2页 / 共61页
YDT - 基于国际多语种域名体系的中文域名的编码处理技术要求.docx_第3页
第3页 / 共61页
YDT - 基于国际多语种域名体系的中文域名的编码处理技术要求.docx_第4页
第4页 / 共61页
YDT - 基于国际多语种域名体系的中文域名的编码处理技术要求.docx_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、ICS 33.040.40M32 YD中 华 人 民 共 和 国 通 信 行 业 标 准YD/T 基于国际多语种域名体系的中文域名编码 处理技术要求Technical specification for coding of chinese domain names(报批稿)-发布 -实施中华人民共和国工业和信息化部 发 布 YD/T I目 次前 言.II引 言 III1 范围 12 规 范 性 引 用 文 件 13 术 语 、 定 义 和 缩 略 语 13.1 术 语 和 定 义 1下列术语和定义适用于本标准。 13.2 缩略语 2下列缩略语适用于本标准。 34 字 符 串 预 处 理 和 中

2、 文 域 名 字 段 预 处 理 34.1 字 符 串 预 处 理 框 架 34.2 字 符 预 备 处 理 概 要 34.3 映射 44.4 归一化 54.5 禁 止 输 出 54.6 双 向 字 符 64.7 字 符 串 预 处 理 框 架 中 的 未 分 配 码 位 64.8 中 文 域 名 字 段 预 处 理 75 Punycode 编码 .75.1 Punycode 特点 .75.2 Bootstring 架构 75.3 Bootstring 参数 95.4 Punycode 参数值 .95.5 Bootstring 算法 95.6 Punycode 算 法 实 现 例 子 .12附

3、录 A ( 规 范 性 附 录 ) UNICODE 保留字符表 .13附录 B ( 规 范 性 附 录 ) 映射表 14附录 B ( 规 范 性 附 录 ) 映射表 15附录 C ( 规 范 性 附 录 ) 禁止输出表 33附录 D ( 规 范 性 附 录 ) 双向字符表 37附录 E ( 资 料 性 附 录 ) punycode 编 码 解 码 例 子 .40附录 F ( 资 料 性 附 录 ) punycode 算 法 编 码 解 码 C 语 言 实 现 例 子 .42YD/T II前 言本标准在技术内容上与 IETF RFC3454国际化字 符串预处理 (20 02 年英 文版) 、I

4、ETF RFC3491国际化域名预处理 ( 2003 年英文 版) 和 IETF RFC3492一 种适用于国际化域名应用的对 UNICODE 码的编码方法: Punycode (2 003 年英 文版) 保持一致, 实现本标准与实现 IETF RFC3454、 IETF RFC3491 和 IETF RFC3492 的 结 果 是 一 样 的 。本标准是中文域名标准系列之一,该系列标准的名称和结构如下:1、 基于国际多语种域名体系的中文域名总体技术要求2、 基于国际多语种域名体系的中文域名的编码处理规范3、 基于国际多语种域名体系的中文域名的一系列应用协议规范和协议测试规范4、 基于国际多语

5、种域名体系的中文域名的一系列软件设计规范和软件测试规范5、 基于国际多语种域名体系的中文域名注册实施规范本标准的附录 A、 附 录 B、附录 C 和 附 录 D 是规范性附录。 本标准的附录 E 和附录 F 是资料性附录。本标准由中国通信标准化协会提出并归口。 标准起草单位:中国互联网络信息中心(C NNIC) 、中国 科 学院计算技术研究所。 标准主要起草人:李晓东、姚健康、钱华林、毛伟、孙国念、刘敏。YD/T III引 言互联网是一个基于开放互联协议的网络, 域名是互联网上的基础服务, 是用于识别和定位互联网上 计算机的层次结构式的字符标识,与计算机的互联网地址 相对应。基于域名可以提供W

6、WW、EMAIL、 FTP 等应用服务。随着互联网的发展, 中文用户的数量不断增加, 对于中文域名的使用需求也在增加。 但是中文域名 和 传 统 的 英 文 域 名 有 较 大 差 别 , 比 如 : 域 名 字 段 分 隔 符 ( 中 文 句 点 和 英 文 句 点 ) 不 同 , 中 文 字 符 有 多 种 形式 (包括简体 、 繁体、 异体 、 古体等等) ; 并且中文域名的字符集比传统的英文域名的字符集大很多 。 为了规范中文域名的使用, 让中文用户能够方便的通过中文域名来使用互联网的各种应用服务, 尽快制 定中文域名标准,进而推动中文域名的使用是十分重要的。本标准是中文域名标准系列中

7、的第二个标准, 它包括了国际化字符串预处理、 国际化域名预处理和 适用于国际化域名应用的对UNICODE码的编码方法,是中文域名标准的编码规范,能更好地促进中文域 名在应用程序及相关协议中的应用。基于国际多语种域名体系的中文域名总体技术要求 规定了中文域名的总体技术处理框架, 该标 准需要对中文域名字段进行一些技术处理,本标准具体规定了技术操作方法和算法。实现对中文域名的支持首先应实现对国际化域名的支持。 该 标 准 的 引 用 IETF RFC3454、 IETF RFC3491 和 IETF RFC3492是 国 际 化 域 名 的 系 列 标 准 。 本 标 准 的 第 3章 “术 语

8、和 定 义 ”是 将 RFC3454、 RFC3491和 RFC3492中的 术语和定义修改归集, 并增加了一些适合本标准的特定的术语和定义。 本标准的第4章 主 要 对应IETF RFC3454和 IETF RFC3491,主要规定了如何对中文域名字段作预处理。本标准的第5章主要对 应IE TF RFC3492, 主要规 定了如何对做完中文域名字段预处理的中文域名字段进行punycode编码 。 要 实 现 对 本 标 准 的 支 持 , 亦 可 直 接 参 照 IETF RFC3454、 IETF RFC3491和IETF RFC3492。YD/T 1基 于 国 际 多 语 种 域 名 体

9、 系 的 中 文 域 名 总 体 技 术 要 求1 范围本标准规定了在互联网体系上使用中文域名的编码规范,规定了使用中文域名字段的预处理要求, 规定了使用 punycode 进 行 编 码 。本标准适用于各级域名注册管理机构、 域名注册服务提供商以及软件厂商开发支持中文域名的应用 或者服务等。2 规范性引用文件下列文件中的条款通过本标准的引用而成为本标准的条款。 凡是注日期的引用文件, 其随后所有的 修改单 (不包括勘误的内容) 或修订版均不适用于本标准, 然而, 鼓励根据本标准达成协议的各方研究 是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本标准。ISO/IEC 1

10、0646-1 信 息 技 术 .通 用 多 重 八 位 长 字 节 编 码 特 征 集 ( UNICODE)IETF RFC 3454 国际化字符串预处理 IETF RFC 3491 国际化域名预处理 UNICODEUAX15 UNICODE 码标准附录 15 UNICODEUTR21 UNICODE 码技术规范 213 术语、定义和缩略语3.1 术语和定义下列术语和定义适用于本标准。3.1.1UNICODE 字 符 编 码UNICODE字 符 编 码 根 据 其 位 置 或 码 位 来 识 别 字 符 , 给 每 个 字 符 提 供 的 一 个 唯 一 的 数 字 。 比 如 说 , U+4

11、E96 指 的 是 在 UNICODE 字 符 集 中 位 于 4E96处 的 字 符 。 本 标 准 的 UNICODE 字 符 编 码 采 用 了 ISO/IEC 10646-1所 规 定 的 , UNICODE字 符 编 码 的 集 合 称 为 UNICODE字 符 集 。3.1.2分 隔 符 delimiter在punycode里用的分隔符是连接符“-”。3.1.3域 名 字 段 label域 名 中 由 分 隔 符 隔 开 的 几 个 部 分 。 例 如 : 对 于 一 个 完 整 的 域 名 “.”, 其 中 “www”、 “cnnic”、 “cn”分 别 是 三 个 域 名 字

12、段 。3.1.4中 文 域 名 字 段 Chinese Domain Label含有中文字符的域名字段。3.1.5中 文 域 名 Chinese Domain Name含有中文域名字段的域名。3.1.6码 位 Code PointsYD/T 2字符的数字表现形式。 在UNICODE里 , UNICODE码 位用“U+“开 始的4到6位 16进制数表示 。 码位序列可 以用没有前缀的用“分隔的两位一组的十六进制数表示。3.1.7溢出 Overflow计算时超出了最大整数值。3.1.8Punycode一 种 编 码 转 换 规 则 。 运 用 这 种 规 则 应 可 实 现 UNICODE字 符

13、编 码 字 符 串 和 LDH字 符 串 的 相 互 转 换 。3.1.9LDH 编码前缀LDH 即 Letter、Digit 和 Hyphen 三 个 英 文 单 词 的 首 字 母 简 写 ; 由 两 个 LDH 字符后跟着两个连字符(其中字母不区分大小写)进行表示的前缀。用于中文域名的 LDH 编 码 前 缀 是 “xn-”。3.1.10操作符 div 和 mod执行数学除法。 div是除 法取商运算, mod是取模 运算。 Bootstring使用这 些操作符来对非负数进行 运算,因此商和余数总是非负的。3.1.11存储字符串 stored string用在协议标识符和名称实体中的字符

14、串。3.1.12查询字符串 query string用于和已保存的标识符相匹配或者相比较的字符串,例如:域名查询中的域名部分。3.1.13NFKCUNICODE 归 一 化 的 一 种 形 式 , 先 对 字 符 进 行 兼 容 性 分 解 , 再 对 其 进 行 规 范 合 成 。3.1.14基础字符 basic code points小范围字符集里的字符,本标准里一般指 ASCII 字 符 集 中 的 字 符 。3.1.15非基础字符 non-basic code points大 范 围 字 符 集 里 的 字 符 , 本 标 准 一 般 指 UNICODE 字 符 集 里 的 字 符 (

15、 ASCII 字 符 除 外 ) 。3.1.16基础字串 basic string所有的字符都是基础字符的字串。3.1.17扩展字串 extended string包含非基础字符的字串。3.1.18字 符 串 预 处 理 Stringprep按照 IETF RFC3454 的 规 定 , 对 字 符 串 进 行 处 理 的 过 程 。3.1.19名 字 预 处 理 Nameprep按照IETF RFC3491的规定,对字符串进行处理,其目的是使其可以用于域名字段,或者检查其是 否可以用于域名字段。3.2 缩略语3YD/T 下列缩略语适用于本标准。CDL Chinese Domain Label

16、 中文域名字段CDN Chinese Domain Name 中文域名CDNA Chinese Domain Names in Applications 中文域名与应用LDH Letters Digits Hyphen 字母、数字、连接符NFKC Normalization Form with Compatibility Composition KC形 式 的 规 一 化4 字符串预处理和中文域名字段预处理4.1 字符串预处理框架本章确立了一个包含有处理 UNICODE 字符规则的 框架模型。 其它协议可以根据这些规则定义自己的 框架, 这些框架可以使用户在应用程序中输入国际化字符串, 并且正

17、确的得到处理。 本标准不规定如何 把 非 UNICODE 码 位 转 化 成 UNICODE 码 位 。 为 了 更 好 的 做 好 字 符 映 射 , 字 符 串 预 处 理 框 架 可 以 有 效 的 排 除 那些不适宜作为中文域名字段的字符。 字符串预处理框架输入的是字串, 输出是字串或错误信息。 字符 串预处理框架不能解决用户期望的所有字符变体问题。 字符串预处理框架应使用附录中的字表来处理字 串。字符串预处理框架必须下列特性:1) 框架所应具有的能力2) 字表,本标准采用 UNICODE3.2 字表3) 映射表4) 所用的归一化5) 禁止字符输出表 字符串预处理框架必须明确所用的字表

18、, 任何字表都是不完善的, 总有一些字会在将来被加进字表中 。 本 标 准 的 第 4.7 节 专 门 规 定 了 如 何 处 理 字 表 中 新 增 加 的 字 符 问 题 。 本 标 准 的 在 附 录 A 中列出了从 0 到 10FFFF 中 未 被 分 配 的 码 位 。 附 录 A 中的码位应被本标准使用。如果附录 A 和 UNICODE3.2 有 任 何 冲 突,附录 A 优先。4.2 字符预备处理概要字符预备处理的步骤包括如下:a) 映 射 对 输 入 的 任 何 字 符 检 查 是 否 拥 有 映 射 , 如 果 有 , 就 使 用 映 射 字 符 代 替 。 在 第 4.3

19、节中详细规定。b) 归一化使用 UNICODE 归 一 化 来 尽 可 能 的 归 一 化 第 一 步 处 理 的 结 果 。 在 第 4.4 节 中 详 细 规 定 。c) 字符禁止输出检查检查输出中是否有任何禁止输出的字符, 如果有, 则返回错误信息。 在第4.5 节 中 详 细 规 定 。d) 检查双向字符 检查是否有从右向左书写的文字, 如果有, 则需要确认整个字符满足双向字符 的 要 求 。 如 果 不 满 足 双 向 字 符 的 要 求 , 则 返 回 错 误 信 息 。 对 于 中 文 域 名 , 本 标 准 在 第 4.6 节中 规定禁止这样的双向字符在中文域名里的使用, 因此

20、如果中文域名字段里出现双向字符, 则返 回错误信息。上述步骤必须按本标准的规定执行, 步骤流程图见图 1。 映射中和归一化中所说的映射可以是一对 零,一对一,一对多,多对多或多对一映射,所以输出的字串有可能比原输入字串长或短。4YD/T 输入字符串是对每个字符检查是否有映射否 用映射字符代替原字符对每个字符进行归 一化检查是否有任何禁止输出 是 是 的字符否 返回错误信息是否含有双向字符是否字符串是否还有其它待 处理字符否字符串预处理结 束图 1 字 符 串 预 处 理 步 骤4.3 映射输入串中的每个字符必须接受一个映射表的检查 , 这个映射表应该来自本标准 , 也可以在具体实现 中改动或者

21、添加。此映射表在本文的附录 B 中 给 出 。本标准的任何实现者都必须使用附录 B 中 给 出 的 映 射 表 列 。 对于任何单个字符,映射表中可以将其映射为空,另外的一个单个字符或者其他的一串字符。5YD/T 经过映射处理的字符就不应再被映射处理。下面是两种用到的映射:a) 经常使用的映射到空字表 有些字符的存在与否对区分两个字串没有任何帮助, 这些字 符将直接从输入中删除 ( 也就是映射到空) 。它们都在附录的表 B.1 中列出。b) 小写转换如果字符串预处理框架准备使用不区分大小写的比较方式进行字符映射, 则它应该使用附 录 B.2 或 者 B.3 中 任 意 一 个 映 射 表 。

22、附 录 B.2 是 为 使 用 了 KC 形 式 的 UNICODE 归 一 化 的 框 架 提 供的, 而附录 B.3 是为 没有使用 UNICODE 归一化 的框架提供的。 这些表都是将大写字母映射到 小 写 字 母 。 转 换 的 原 因 是 目 前 大 多 数 Internet 程 序 和 协 议 中 都 使 用 小 写 字 母 。 如果一个框架建立自己的小写转换映射表, 则必须依据 UTR21, 并且应 该映射大写字母到小写字 母 。 从 UNICODE 数 据 库 得 到 的 “CaseFolding.txt”文 件 也 应 该 用 于 建 立 这 个 映 射 表 。 如果一个框架

23、使用了 KC 形式的 UNICODE 归 一 化 , 则 必 须 注 意 一 点 : 有 些 字 符 在 UTR21 规定中不存在映射, 但仍需进行处理。 这些字符包括一些希腊字母和许多包括拉丁字符的符号。 需要加入 映射表的字符列可由下列算法决定:b = NormalizeWithKC(Fold(a); c = NormalizeWithKC(Fold(b);如果 c 与 b 不相同,则增加一个从 a 到 c 的 映 射 。因 为 NormalizeWithKC(Fold(c)总 是 等 于 c, 所 以 这 个 表 是 稳 定 的 。附 录 B.3 是 源 自 和 UNICODE3.2 想

24、 关 联 的 CaseFolding-3.txt 文 件 。 而 附 录 B.2 是 在 附 录 B.3 的基础上增加由以上算法所确定的增加字符额外映射。字符串预处理需要更新框架时, 如果改变任何目前已分配码位的映射, 需要注意这个改变的影 响。 对已分配码位增加一个映射或者改变一个映射都有可能导致一个已升级的系统和另一个没有升 级的系统之间的不一致性。4.4 归一化映 射 之 后 的 输 出 可 以 选 择 使 用 UAX15 中 规 定 的 一 种 UNICODE 归 一 化 形 式 进 行 归 一 化 处 理 , 归一化可 以使等效的字符有相同的二进制表示形式。字符串预处理框架可以选择使

25、用两种归一化方式中的一种:1) 不 进 行 归 一 化2) 使 用 KC 形 式 的 UNICODE 归 一 化 字符串预处理框架可以选择不进行归一化。 然而这样的框架可能会使一些用户惊讶的发现结果和输入不一致。比如一些输入机制可以输入一些字形上容易混淆的兼容字,结果却是两个截然不同的码位。 虽然 UNICODE 归一化需要 相当大的字表和有点复杂的字符排列逻辑, 除非在特殊情况下, 字符串预处理框架都应使用归一化。 本标准并 没有给出 UNICODE 归一化 所需要的表, 但 是 这 些 表 必 须 是 源 自 UAX15 的定义的 UNICODE 库。还存在第三种归一化形式, 就是 C 形

26、 式的 UNICODE 归一化。 如果一个框架要使用 UNICODE 归一化则 其 必 须 使 用 KC 形 式 的 UNICODE 归 一 化 。 KC 形 式 的 归 一 化 将 很 多 兼 容 字 符 映 射 成 他 们 的 等 效 字 符 。 有 一 些用户界面允许用户输入一些兼容性字符而不是原本的等效字符,所以使用 KC 形 式 的 归 一 化 来 代 替 C 形式的归一化会使更多的字符得到正确的映射。凡是指定了 UNICODE 归一 化的字符串预处理框架必须使用在 UAX15 中规定 的, 并且与本标准中指定 的 UNICODE 字 符 集 相 配 套 的 归 一 化 形 式 。4

27、.5 禁止输出在文本输出之前, 一定要进行禁止字符的检查。 字符串预处理框架应使用附录 C 中定 义的全部或者 部分禁止输出表。字符串预处理处理过程不会既返回错误信息又返回一个字符串, 如果在检查禁止输出的过程中发生6YD/T 任何错误,则只返回错误信息。 禁止输出的字符主要有几下几类: a) 空格字符b) 控制字符c) 专用字符d) 非字符码位e) 代理码位f) 与无格式字符不相称的g) 与标准表示不相称的h) 改变显示属性或者被 UNICODE 摒弃的i) 标签字符这些禁止字符表详情见附录 C, 任 何 框 架 实 现 的 时 候 可 以 增 加 别 的 禁 止 输 出 字 符 。4.6

28、双向字符大多数字符是从左到右显示的, 但是有些字符是从右到左显示的, 附录 D 双向字 符表。 本标准禁止 这样的双向字符的使用,如果检测到双向字符,应给出错误信息。4.7 字符串预处理框架中的未分配码位本节规定了在典型的协议中使用国际化字符串的两种类型: “存储字符串” 和 “查询字 符串” 。 “存 储字符串” 是指用在协议表示符和名称实体中的字符串, 比如数字证书中的名称和 DNS 域名 部分。 “查 询字符串” 是指用于与已保存的标示符相匹配或者相比较的字符串, 比如用户敲入的数字证书的名字和 DNS 查 询 中 的 名 称 。在字符串预处理框架中没有被分配字符的所有码位都被叫做 “未

29、分配码位” 。 使用 这个框架的存储 字符串禁止包含任何未分配码位。而用于匹配字符串的查询字符串可以包含未分配码位。字符串预处理框架必须给出未分配码位列表,并且这个列表必须被这个框架的实施者使用。 本标准禁止两个包含未分配码位的字符串之间的比较。 当两个字符串 X 和 Y 进行比 较, 并且字符串Y 是 经 过 允 许 包 含 未 分 配 码 位 的 方 式 处 理 得 到 的 , 如 果 比 较 结 果 是 不 匹 配 , 则 这 个 结 果 具 有 不 确 定 性 ; 此时很有可能的结果是:两个串不匹配,但是当对字符串 Y 使 用 一 个 更 新 的 框 架 的 时 候 结 果 却 匹 配

30、 了 。 如果当两个字符串 X 和 Y 都 是 经 过 允 许 包 含 未 分 配 码 位 的 方 式 处 理 得 到 的 的 话 就 有 可 能 发 生 更 坏 的 结 果: 即使比较结果是匹配, 也具有不确定性, 此时很有可能的结果是: 两个串匹配而使用一个更新的框 架的时候结果却不匹配了(当一个码位在 X 和 Y 中 都 被 禁 止 输 出 ) 。本标准禁止存储字符串包含有任何未分配码位。4.7.1 代码位的种类: 在字符串预处理框架中定义的每个码位都可以根据他在上述步骤中的操作方式进行分类: a) AO, 可 以 在 输 出 中 出 现 的 代 码 位 ;b) MN, 因 为 映 射

31、或 者 归 一 化 而 不 可 能 出 现 在 输 出 中 的 代 码 位 ;c) D, 因 为 在 禁 止 输 出 步 骤 中 被 禁 止 而 不 可 能 出 现 在 输 出 中 的 代 码 位 ; d) U, 未 分 配 的 代 码 位 。新版本的字符串预处理框架中的字表会出现新的码位,这些新的码位应从 U 分类中转移到 MN,AO 或 者 D 分 类 。 为 了 向 后 的 兼 容 性 , 新 版 本 的 框 架 不 应 从 别 的 任 何 分 类 中 转 移 码 位 。 既 当 前 在 MN, AO 和 D 分 类 中 的 码 位 一 定 不 能 转 移 到 其 他 分 类 中 。最

32、新 版 本 字 符 串 预 处 理 框 架 中 的 存 储 字 符 串 禁 止 包 含 除 了 AO 分 类 之 外 的 码 位 , 既禁止 包含任何 MN, D,或者 U 分 类 中 的 码 位 。应用程序在创建一个查询时,这个应用程序在输入时应把 U 类 代 码 位 当 作 AO 类 代 码 位 看 待 。 这 些7YD/T 应用程序可以有选择的使用一个提供严格字符检查的预处理程序: 把输入中出现的未分配代码位当作错 误或者警告用户本软件中的当前版本的框架识别出未分配代码位。4.8 中文域名字段预处理中 文 域 名 字 段 预 处 理 nameprep 是 字 符 串 预 处 理 的 一

33、种 框 架 , 实 现 nameprep 必 须 首 先 完 全 实 现 字 符 串预处理。nameprep 是 用 来 直 接 处 理 中 文 域 名 字 段 的 , 而 不 是 整 个 域 名 。 CDNA 对 每 个 域 名 字 段 会 调 用 nameprep。 Nameprep 使 用 附 录 A 中 的 字 表 ; 映 射 时 使 用 附 录 B.1 和 B.2; 归 一 化 时 使 用 KC 形 式 的 归 一 化 ; 禁 止 输 出 表 使 用 附 录 表 C.1.2、 C.2.2、 C.3、 C.4、 C.5、 C.6、 C.7、 C.8、 C.9; 如 果 应 用 程 序

34、在 实 现 CDNA 时 使 用 未 分 配 码 点 列 表 , 应 使 用 附 录 A.1 中 的 字 表 。5 Punycode 编 码5.1 Punycode 特 点CDNA规定 了支持 CDN 的架构。 非 ASCII 形式的 域名字段可以用 ACE 前 缀开始的 ACE 形式表示。 后 缀是 UNICODE 字串的 punycode 编码。 Punycode 是 一种为国际化多语种域名设计的一种简单高效的转换 编 码 方 法 。 它 唯 一 且 可 逆 转 地 把 UNICODE 字 串 转 换 成 ASCII 字 串 。 UNICODE 里 的 ASCII 字 符 还 是 按 原

35、来 的 字 符 显 示 , 非 ASCII 字 符 用 ASCII 字 符 中 LDH 表 示 。 本 标 准 规 定 了 一 种 叫 bootstring 的 通 用 算 法 来 用 基 础 码 位 来 表 示 大 字 符 集 中 的 码 位 串 。 Punycode 是 bootstring 算 法 的 特 殊 形 式 , 它 使 用 了 专 门 的 参 数 使 其 符 合 国 际 化 多 语 种 域 名 应 用 的 需 要 而 设 计 , Punycode 主 要 是 用 来 把 中 文 域 名 字 段 转 换 成 ASCII 形式。Bootstring 被设计成有下列特点:a) 完备性

36、:任意扩展的字串可以被基础字串表示,对字串的限制可以在应用的高层来做; b) 唯一性:至多只有一个基础字串表示扩展字串;c) 可逆转性:任何被表示成基础字串的扩展字串可以从基础字串转换回来; d) 编码高效性:基础字串的长度和扩展字段的长度的比值很小;e) 简单性:编码和解码方法容易实现;f) 可读性:扩展字串中的基础码位仍旧被表示成原来的码位。5.2 Bootstring 架 构Bootstring 把 扩 展 字 串 表 示 成 基 础 字 串 。 随 后 的 几 小 节 规 定 了 bootstring 里的 4 项技术。 基础码位分离是一次性把扩展字串中的基础码位一次性的复制出来。 插

37、入未整理的编码是把非基础码位分成堆,这些堆的排列不是根据码位出现的顺序而是码位所代表的数字顺序, 这样可以导致更小的堆。 这些堆可以被表示成通用可变长整数, 然后可以再用基础码位来 表示。当连续的堆有相似的量级的时候,这些整数表示可以用贝叶斯调解“bias adaptation“来动态调 解参数,增强有效性。5.2.1 基础码位分离所 有 出 现 在 扩 展 字 串 里 的 基 础 码 位 按 它 们 原 来 的 出 现 顺 序 依 次 排 在 基 础 串 的 前 面 作 为 基 础 串 的 前 半部分。 基础串的前半部分和后半部分用分隔符分开。 分隔符是一个特殊的符号, 它从来不会出现在基

38、础串的后半部分。5.2.2 插入未排序码位基础串的后半部分把非负整数形成的堆的序列表示成通用可变长整数,这一点主要在第 5.2.3 节着 重规定。 在这里可以把堆看成解码器。 解码器逐渐建立扩展串。 开始时, 扩展串是基础串中前半部分的 完 全 复 制 ( 不 包 括 分 隔 符 ) 。 解 码 器 为 每 个 堆 建 立 一 个 非 ASCII 码 位 插 入 到 扩 展 串 中 , 依 次 解 码 , 最 后 完全解码。这个过程的核心部分是状态机。状态机用序号 i(index i) 和 计 数 器 n( counter n) 表 示 。 i 表 示 在 基 础 串 中 的 位 置 , 它

39、的 值 的 变 化 范 围 是 0( 第 一 个 位 置 ) 到 当 前 的 串 的 长 度 。 假 如 当 前 的 状 态8YD/T 是 , 下 一 个 状 态 就 是 ( i 小 于 当 前 串 的 长 度 ) 或 者 ( i 等 于 当 前 串 的 长 度 ) 。 每 次 状态变化引起 i 增加,当 i 等于当前串的长度时,i 就会被置 0,同时 n 加 1。状态总是单向增长,不 会返回到原来的状态。 在每个状态, 插入操作可以进行也可以不进行。 对于任何一个状态最多只能进行 一次插入操作。 每次插入操作都是把 n 的值放在当 前扩展串的第 i 个位置。 堆是一系列活动的实时编码: 堆是

40、是在插入状态之前的非插入状态的个数。对每个堆,解码器执行堆状态变化,然后执行插入操作, 然后再下一个状态变化, 在实现时, 不必每次单独执行状态变化, 可以用除法和取余运算来直接算出下 次插入状态。如果插入的码位是基础码位会产生错误。编码器主要任务是从扩展串中得到堆的序列。 编码器不停的扫描扩展串中的下个码位, 算出解码器 需要执行的状态变化次数。 同时 , 要 注意解码中的扩展串只会包括那些已经被插入的码位。 第 6.3 节会 给出确切的算法。5.2.3 普通可变长整数在传统的整数表示方法中,基数(base)就是 0 到 base 减 1 个数字符号的个数。digit_0 代表权 重最小的数

41、,digit_1 代 表 权 重 下 个 最 小 的 数 , 依 次 排 列 。 整 数 所 表 示 的 值 是 所 有 digit_j 乘以 w(j) 的 和 (w(j)是 digit_j 所 处 位 置 的 权 值 )。 这种表示方法有两个缺点 : 首先, 对每个数值有多种编码方法, 对要求单一编码的操作很不方便;第二,如果多个整数连接在一起,不能根据自己的特点把它们分开, 这些整数之间的界限就消失了。通用可变长表示法解决了上述两个问题。每个数字符号值依然是 0 到 base 减 1。 整数可以通过极限 t(j) ( 0= 0 时 解码过程和传统的整数解码过程非常类似: 从当前值 N 0

42、和权重 w 1 开始; 取出下个整数, 然后令 N N d * w;如果 d 小于当前极限 t, 处 理 过 程 停 止 , 否 则 , 根 据 因 子 (base - t)来获得新的 w 值, 把 t 更 新 到 下 个 位 置 的 值 , 这 种 过 程 不 断 重 复 。 编 码 过 程 也 和 传 统 整 数 的 编 码 过 程 类 似 。 如 果 N (base - tmin) * tmax) div 2; do let delta = delta div (base - tmin);9YD/T 4) Bias 通 过 如 下 方 式 取 得 :bias =(base * 在 步 骤

43、 3 中 的 除 法 执 行 次 数 ) +(base - tmin + 1) * delta) div (delta + skew) 当 前 堆 隐 藏 了 下 个 堆 可 能 大 小 的 信 息 , 因 此 当 t(j)等于 tmax 时 , 权 重 较 大 的 数 字 有 可 能是倒数最后一个数字, 当 t(j)等 于 tmin 时 , 权 重较小的数字有可能是倒数第三个数字, 当 t(j) 介 于 tmin 和 tmax 时 , 相 对 应 的 数 字 有 可 能 是 倒 数 第 二 个 数 字 。5.3 Bootstring 参 数给定一个基础码位字符集,需要指定其中一个为分隔符。B

44、ase 的值不能大于所有剩余的可区分的 基 础 码 位 的 数 量 。 每 个 数 字 所 代 表 的 值 从 0 到 base - 1 变 化 , 需 要 和 可 区 分 的 非 分 隔 符 相 联 系 。 在 有 些情况下, 有些码位需要同样的数字值, 如果基础码位不区分大小写, 一个字母的大写和小写方式需要 等 效 。 n 的 初 始 值 不 能 大 于 在 扩 展 字 串 中 最 小 的 非 基 础 码 位 。 剩 下 的 5 个 参 数 min, tmax, skew, damp, bias 的 初 始 值 ( initial_bias) 必 须 满 足 下 列 要 求 :0 = 1

45、;damp = 2;initial_bias mod base (base - tmin) * tmax) div 2 do begin let delta = delta div (base - tmin)let k = k + base endreturn k + (base - tmin + 1) * delta) div (delta + skew)在 adapt()函数内对 delta 和 k 的 修 改 并 不 影 响 在 编 码 和 解 码 过 程 中 同 名 的 变 量 , 因 为 在 调 用 adapt()函 数 后 , 调 用 者 在 读 取 前 会 先 覆 盖 原 来 的

46、 值 。5.5.2 解码过程函数开始:let n = initial_n let i = 0let bias = initial_biaslet output = an empty string indexed from 0, 序 号 从 0 开 始 的 空 字 符 串 如 果 在 最 后 一 个 分 隔 符 之 前 存 在 码 位 , 把 这 些 码 位 复 制 到 output, 如 果 发 现 非 基 础 码 位 , 则 失败退出。如果成功复制出的码位数大于零,则需要处理分隔符。 while 如 果 输 入 串 input 中 的 字 符 没 有 被 处 理 完 do beginlet

47、oldi = i let w = 1for ( k = BASE; k += BASE) do begin 处 理 一 个 码 位 , 如 果 没 有 码 位 可 处 理 , 则 给 出 错 误 信 息let digit = 码 位 所 代 表 的 数 字 值 , ( 如 果 没 有 码 位 可 处 理 , 则 给 出 错 误 信 息 ) let i = i + digit * w, ( 如 果 数 值 溢 出 则 给 出 错 误 信 息 )let t = tmin if k = bias + tmax 或 者 t=k - bias (k 取 其 它 值 )if digit = bias +

48、tmax, 或者 t=k - bias (k取 其 它 值 )if q t then break为 d igit t + (q - t) mod (base - t)输 出 码 位 let q = (q - t) div (base - t)end为 数 字 q 输 出 码 位let bias = adapt(delta, h + 1, test h equals b?) let delta = 0增 加 h endend增 加 delta 和 n end函数结束 如 果 所 有 小 于 initial_n的 码 位 是 基 础 码 位 , 在括号里的关于检查是否有非基础码位小于n的表述 可以

49、 被 忽 略 。 ( 在 punycode里 , 如 果 码 位 是 无 符 号 时 , 上 述 判 断 成 立 ) 。 在punycode里,如果initial_n大于所有基础码位,那么括号里关于基础码位和非基础码位的判断可 以 被 忽 略 。 在 给 t赋 值 时 , 如 果 t在 tmin到 tmax之 间 , “+ tmin“操 作 总 是 被 忽 略 。 当 bias k bias + tmin时 , 这 种 忽 略 操 作 会 存 在 问 题 。 由 于 对 bias的 计 算 方 式 和 参 数 做 了 限 制 , 这 种 情 况 不 会 发 生 。12YD/T 为 了 避 免 可 能 产 生 无 效 输 出 , 应 该 做 溢 出 的 检 查 。 到 外 部 循 环 最 后 时 , 因 为 delta length(input) 而 且 length(input)也 是 可 表 示 的 , 堆

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 规范标准 > 国内外标准规范

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报