中文域名(CDN)的编码技术是中文域名(CDN)系统的关键技术之一。CDN编码技术就是规范在互联网上使用CDN的编码方法,包括字符串预处理框架和中文域名字段预处理的框架。在介绍CDN编码技术之前需要首先介绍其相关的知识。
欲详细了解中文域名系统介绍的请进入。
一、字符串预处理(stringprep)
1、字符串(string)
字符串(string)就是由字符组成的序列,可以包含字母、数字、符号和空格等字符,字符可以是任何的Unicode字符,包括ASCII字符和非ASCII字符。事实上,通常在互联网上传输的字符串,突出的例子如互联网上传输的域名(DN,Domain Name)。域名是由字段组成,每个字段又是由字符构成,这些字符在互联网上传输时就形成了字符串。
欲具体了解Unicode字符介绍的请进入。
2、字符串预处理(stringprep)概念
字符串预处理(stringprep)是由IETF的RFC 3454《Preparation of Internationalized Strings(国际化字符串的预处理)》所规范提出的。国际化字符串是指除了包括LDH(字母(Letter)、数字(Digit)和连接符(Hyphen)等)字符外,还包括非LDH字符(如中文字符等)所形成的字符串。这里的国际化是相对于国际化域名(IDN)而言(注意:中文域名(CDN)是IDN的一种)。国际化字符串的预处理简称字符串预处理(stringprep)。
字符串预处理(stringprep)是指在将字符串用于网络传输之前,对其进行一系列的处理过程,以确保字符串具有特定的标准形式。RFC 3454标准定义了一系列表格,这些表格可以被组合为不同的配置,每个配置都定义了所使用的表格和其他可选项。字符串预处理主要用于互连网协议中,确保在网络传输中字符串的格式和内容符合标准,避免因格式不一致导致的问题。
字符串预处理的具体步骤和目的包括:其一是使用预备过程:在将字符串进行网络传输之前,先对其进行预备处理,确保字符串具有特定的标准形式。其二是配置选项:配置选项包括所使用的表格和其他可选项,这些配置确保了字符串的标准化和一致性。我们知道,在C语言中,预处理指令主要用于在编译前对源代码进行简单的加工,如包含头文件、宏定义等。而字符串预处理则是在网络传输前对字符串进行特定的处理,确保其在网络中的正确传输和解析。两者虽然都涉及“预处理”的概念,但应用场景和具体操作有所不同。
3、字符串预处理(stringprep)框架
字符串预处理框架确立了一个包含处理Unicode 字符规则的框架模型。其它协议可根据这些规则定义自己的框架,这些框架可使用户在应用程序中输入国际化字符串,并且正确地得到处理。RFC 3454不规定如何把非Unicode 码位转化成Unicode码位。字符串预处理框架输入的是字符串,输出是字符串或错误信息。字符串预处理框架不能解决用户期望的所有字符变体问题。RFC 3454公布了一系列表格,分为两类:集合(in)和映射(map)。对于集合(in),stringprep 提供了“特征函数”,即如果形参是集合的一部分则返回值为 True 的函数。对于映射(map),它提供了映射函数,它会根据给定的键返回所关联的值。下表1-3-1给出了stringprep中所有可用函数的列表说明。
表 1-3-1:stringprep中所有可用函数的列表说明
字符串预处理(stringprep)过程包括:映射、归一化(或称标准化)、禁止输出检查和双向字符检查,其简要说明详见下表1-3-2。映射中和归一化中所说的映射可是一对零,一对一,一对多,多对多或多对一映射,所以输出的字串有可能比原输入字串长或短。RFC 3454的内容重点规定了这些过程的要求。
表 1-3-2:字符串预处理(stringprep)过程简介
欲详细了解RFC 3454标准具体内容的请进入。
二、中文域名字段预处理
中文域名字段预处理是字符串预处理的一种框架特例,实现中文域名字段预处理应首先完全实现字符串预处理(stringprep)。其目的是使其能用于中文域名字段,或者检查其能否用于域名字段。中文域名字段预处理是用来直接处理中文域名字段的,而不是整个域名。中文域名与应用(CDNA)对每个域名字段会调用中文域名字段预处理。在我国国家标准GB/T 44278定义了中文域名与应用(CDNA)框架。
欲详细了解GB/T 44278标准关于CDNA介绍的请进入。
中文域名字段预处理使用Unicode保留字符表中的字表(见RFC 3454表A.1),如果应用程序在实现CDNA 时使用未分配码点列表,也应使用该字表;映射时使用RFC 3454的映射表(见RFC 3454表B.1、表B.2和表B.3);归一化时使用形式的归一化(NFKC,Normalization Form with Compatibility Composition);“禁止输出”字符应使用RFC 3454的禁止输出表(见RFC 3454表C.1~表C.9)。
三、关于Punycode 编码
1、概述
我们知道,中文域名与应用(CDNA)规定了支持CDN 的架构,在该架构中就规定到中文域名字段字符的编码要求。该框架要求中文域名名字字符的编码应采用Punycode 编码。Punycode 是一种为国际化多语种域名设计的一种简单高效的转换编码方法,Punycode 是 Bootstring 算法的一个特例,Bootstring 的通用算法,来用基础码位表示大字符集中的码位串。Punycode和Bootstring是由IETF RFC 3492《Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications(IDNA)(Punycode:一种用于IDNA的Bootstring编码)》所规范,适用于 IDNA,而CDNA的实现应支持IDNA。
RFC 3492要要求,非ASCII 形式的域名字段可用ACE(ASCII Compatible Encoding,ASCII编码兼容)前缀开始的ACE 形式表示;后缀是Unicode 字串的Punycode 编码。Punycode 编码唯一且可逆转地把Unicode字串转换成ASCII 字串。Unicode里的ASCII 字符还是按原来的字符显示,非ASCII 字符用ASCII 字符中LDH 表示。RFC 3492规定了一种叫bootstring 的通用算法来用基础字符(一般指ASCII字符集中的字符,其等同于我国GB/T 1988规定的编码)码位来表示大字符(一般指Unicode字符集里的字符集(ASCII字符除外),其等同于我国GB/T 13000规定的编码)中的码位串。Punycode 是Bootstring 算法的特殊形式,它使用了专门的参数使其符合国际化多语种域名应用的需要而设计, Punycode 主要是用来把中文域名字段转换成ASCII 形式。Bootstring 被设计成具有下列特点:完备性、唯一性、可逆转性、编码高效性、简单性和可持续性等,其具体表述详见下表3-1。
表 3-1:Bootstring算法的特点
2、Bootstring算法简介
Bootstring的框架包括4项技术:基础码位分离;插入未排序码位;广义变长整数;贝叶斯适应(Bias adaptation)。其含义的表述详见下表3-2。Bootstring算法的内容包括:贝叶斯适应函数;解码过程;编码过程;溢出的处理。Bootstring算法的具体要求详见RFC 3492。
表 3-2:Bootstring框架的简述
欲详细了解RFC 3492标准具体内容的请进入。
四、中文域名编码技术
我国国家标准GB/T 44596《中文域名编码技术要求》规定了在互联网体系上使用中文域名(CDN)的编码规范,以及使用中文域名字段的预处理要求,同时规定了利用国际化域名(IDN)码进行CDN编码的技术要求。该国家标准所规范的CDN编码技术要求,使用了上述的RFC 3454规范的字符串预处理(stringprep)技术和RFC 3492规范的Punycode 编码方法。另外,我国通信行业标准YDT 2143《基于国际多语种域名体系的中文域名的编码处理技术要求》也提出了与GB/T 44596国标相同的技术要求。若要详细了解这两个国内标准关于CDN编码技术要求具体内容的请详见下述附件。
附件 4-1:GB/T 44596-2024《中文域名编码技术要求》
附件 4-2:YDT 2143-2010《基于国际多语种域名体系的中文域名的编码处理技术要求》
欲详细了解中文域名的字表技术要求的请进入。