前言
虽然编码(encodings)已做了某种程序上的如下定义:实现(implementations)并不总是以同样的方式实现他们,也没有总是使用相同的标签(labels),并且经常用不同的方法处理未定义和前专有领域的编码。但这个规范试图填补这些空白:在新实现不需要对市场领导者进行逆向编码的同时让已有的实现集中在一起。
这个规范主要是用于处理遗留内容,它需要新的内容和格式使用utf - 8作为唯一的编码。
一致性
所有的图表,示例,和笔记在此规范中是非规范化的,同样在这些部分里会标记出非规范化。在这个范围之外的都是规范的。
在这篇文档的规范部分的关键字“必须(MUST)”、“不能(MUST NOT)”、“需要(REQUIRED)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“可能(MAY)”和“可选的(OPTIONAL)”的具体解释在RFC2119中。介于可读性,这些词汇在规范内将不会以大写方式出现。[RFC2119]
一致性要求规定算法或特定的步骤只要最终结果是等价可以任何方式可以实现。(尤其是算法定义在这个规范旨在成为最容易理解。而不是最高性能的。)
用户代理可以对实现施加特定的限制,否则会产生不受约束的输入,例如防止拒绝服务攻击,防止耗尽内存,或者为了解决特定于平台的局限性。
术语
十六进制数字加上前缀“0x”。
在方程中,所有的数字是整数,另外加用“+”表示、减用“−“表示,乘用“×”表示,除用“/”表示,计算除法的余数(也称为模)由“%”表示,由“bn”表示求幂运算,左位移用“<<”表示,右位移用“>>”表示,“与”用“&”表示,或用“|”表示。
一个字节是由八个比特组成的,表示为一个范围在0x00到0xFF的两位数的十六进制数。
一个代码点是一个Unicode代码点同时被表示为一个4到6位数的十六进制数,通常加上前缀“U+”。在方程和索引的代码点加上前缀“0x”。[UNICODE]
ASCII空格的代码点是 U+0009, U+000A, U+000C, U+000D, 和 U+0020.
一个字符串是一个序列的代码点。
用不区分大小写的方式比较两个ASCII字符串意味着最精准的比较、代码点对代码点,除了字符 U+0041范围为 U+005A(即答谢拉丁字母A到大写拉丁字母Z)和相应的字符范围U+0061到U+007A(即小写拉丁字母A到小写拉丁字母Z)外也被认也匹配。
编码
一个编码定义了一个映射从一个代码点到一个或多个字节(反之亦然)。每个编码有一个名称和一个或多个标签。
没有编码都有其解码器和编码器的算法。
一个解码器算法处理一个字节流,并发出一连串的代码点。字节指针最初是零,指向流内的第一个字节。它不会是负的。它可以增加和减少以指向其他流内的字节。EOF字节是概念字节,代表流的结束。字节指针不能逾越EOF字节。EOF代码点是一个概念性的代码点,其被发出一次后流处理的字节数后获得它的全部。一个解码器错误显示一个错误的字节流。除非另有规定外发出一个解码器错误必须发出U+FFFD代码点。一个解码器可以通过发射一个代码点或译码器错误结束或者继续。除非EOF代码点发出,译码算法必须再次调用。
一个XML处理器会停止在第一个译码器错误发出时。
一个编码器算法处理一系列的代码点和发出一连串的字节。当一个代码点是通过它没有相应字节或字节序列时他奖失败,一个解码器也类似,它有一个代码点指针和编码器误差。除非另有规定外发出一个编码器误差终止该编码器。再一次类似地,只要EOF字节没有发出,编码器算法必须调用每个字节或字节序列以发出。
HTML表单和URLs需要终止编码器同时特殊处理遇到的编码器错误。而不是终止编码器序列的一个或多个范围在U+0000到U+007F代码点(代表代码点导致编码器错误被发出)被插入到代码点指针的代码点流在编码器错误发出后。
下面的表格列出了所有编码和它们标签的用户代理必须支持。用户代理必须不支持任何其他编码或标签。
从一个字符串标签获得一个编码,运行这些步骤:
1.删除标签中任何前导和尾随空格的ASCII。
2.如果标签是一个大小心不敏感的ASCII匹配下表的任何标签,则返回相应的编码,否则返回失败。
该算法是不同于一个第1.4节所定义的Unicode技术标准#22,算法与遗留内容不兼容。
编码:
| utf-8
|
| "unicode-1-1-utf-8"
|
| "utf-8"
|
| "utf8"
|
|
遗留单字节编码:
| ibm866
|
| "866"
|
| "cp866"
|
| "csibm866"
|
| "ibm866"
|
|
| iso-8859-2
|
| "csisolatin2"
|
| "iso-8859-2"
|
| "iso-ir-101"
|
| "iso8859-2"
|
| "iso88592"
|
| "iso_8859-2"
|
| "iso_8859-2:1987"
|
| "l2"
|
|
| iso-8859-3
|
| "csisolatin3"
|
| "iso-8859-3"
|
| "iso-ir-109"
|
| "iso8859-3"
|
| "iso88593"
|
| "iso_8859-3"
|
| "iso_8859-3:1988"
|
| "l3"
|
|
| iso-8859-4
|
| "csisolatin4"
|
| "iso-8859-4"
|
| "iso-ir-110"
|
| "iso8859-4"
|
| "iso88594"
|
| "iso_8859-4"
|
| "iso_8859-4:1988"
|
| "l4"
|
|
| iso-8859-5
|
| "csisolatincyrillic"
|
| "cyrillic"
|
| "iso-8859-5"
|
| "iso-ir-111"
|
| "iso8859-5"
|
| "iso88595"
|
| "iso_8859-5"
|
| "iso_8859-5:1988"
|
| "l5"
|
|
| iso-8859-6
|
| "arabic"
|
| "asmo-708"
|
| "csiso88596e"
|
| "csiso88596i"
|
| "csisolatinarabic"
|
| "ecma-114"
|
| "iso-8859-6"
|
| "iso-8859-6-e"
|
| "iso-8859-6-i"
|
| "iso-ir-127"
|
| "iso8859-6"
|
| "iso88596"
|
| "iso_8859-6"
|
| "iso_8859-6:1987"
|
|
| iso-8859-7
|
| "csisolatingreek"
|
| "ecma-118"
|
| "elot_928"
|
| "greek"
|
| "greek8"
|
| "iso-8859-7"
|
| "iso-ir-126"
|
| "iso8859-7"
|
| "iso88597"
|
| "iso_8859-7"
|
| "iso_8859-7:1987"
|
| "sun_eu_greek"
|
|
| iso-8859-8
|
| "csiso88598e"
|
| "csisolatinhebrew"
|
| "hebrew"
|
| "iso-8859-8"
|
| "iso-8859-8-e"
|
| "iso-ir-138"
|
| "iso8859-8"
|
| "iso88598"
|
| "iso_8859-8"
|
| "iso_8859-8:1988"
|
| "iso_8859-7:1987"
|
| "visual"
|
|
| iso-8859-8-i
|
| "csiso88598i"
|
| "iso-8859-8-i"
|
| "logical"
|
|
| iso-8859-10
|
| "csisolatin6"
|
| "iso-8859-10"
|
| "iso-ir-157"
|
| "iso8859-10"
|
| "iso885910"
|
| "l6"
|
| "latin6"
|
|
| iso-8859-13
|
| "iso-8859-13"
|
| "iso8859-13"
|
| "iso885913"
|
|
| iso-8859-14
|
| "iso-8859-14"
|
| "iso8859-14"
|
| "iso885914"
|
|
| iso-8859-15
|
| "csisolatin9"
|
| "iso-8859-15"
|
| "iso8859-15"
|
| "iso885915"
|
| "iso_8859-15"
|
| "l9"
|
|
| koi8-r
|
| "cskoi8r"
|
| "koi"
|
| "koi8"
|
| "koi8-r"
|
| "koi8_r"
|
|
| macintosh
|
| "csmacintosh"
|
| "mac"
|
| "macintosh"
|
| "x-mac-roman"
|
|
| windows-874
|
| "dos-874"
|
| "iso-8859-11"
|
| "iso8859-11"
|
| "iso885911"
|
| "tis-620"
|
| "windows-874"
|
|
| windows-1250
|
| "cp1250"
|
| "windows-1250"
|
| "x-cp1250"
|
|
| windows-1251
|
| "cp1251"
|
| "windows-1251"
|
| "x-cp1251"
|
|
| windows-1252
|
| "ansi_x3.4-1968"
|
| "ascii"
|
| "cp1252"
|
| "cp819"
|
| "csisolatin1"
|
| "ibm819"
|
| "iso-8859-1"
|
| "iso-ir-100"
|
| "iso8859-1"
|
| "iso88591"
|
| "iso_8859-1"
|
| "iso_8859-1:1987"
|
| "l1"
|
| "latin1"
|
| "us-ascii"
|
| "windows-1252"
|
| "x-cp1252"
|
|
| windows-1253
|
| "cp1253"
|
| "windows-1253"
|
| "x-cp1253"
|
|
| windows-1254
|
| "cp1254"
|
| "csisolatin5"
|
| "iso-8859-9"
|
| "iso-ir-148"
|
| "iso8859-9"
|
| "iso88599"
|
| "iso_8859-9"
|
| "iso_8859-9:1989"
|
| "l5"
|
| "latin5"
|
| "windows-1254"
|
| "x-cp1254"
|
|
| windows-1255
|
| "cp1255"
|
| "windows-1255"
|
| "x-cp1255"
|
|
| windows-1256
|
| "cp1256"
|
| "windows-1256"
|
| "x-cp1256"
|
|
| windows-1257
|
| "cp1257"
|
| "windows-1257"
|
| "x-cp1257"
|
|
| windows-1258
|
| "cp1258"
|
| "windows-1258"
|
| "x-cp1258"
|
|
| x-mac-cyrillic
|
| "x-mac-cyrillic"
|
| "x-mac-ukrainian"
|
|
中文(简体)遗留的多字节编码:
| gbk
|
| "chinese"
|
| "csgb2312"
|
| "csiso58gb231280"
|
| "gb2312"
|
| "gb_2312"
|
| "gb_2312-80"
|
| "gbk"
|
| "iso-ir-58"
|
| "x-gbk"
|
|
中文(繁体)遗留的多字节编码:
| big5
|
| "big5"
|
| "big5-hkscs"
|
| "cn-big5"
|
| "csbig5"
|
| "x-x-big5"
|
|
遗留的多字节日语编码:
| euc-jp
|
| "cseucpkdfmtjapanese"
|
| "euc-jp"
|
| "x-euc-jp"
|
|
| iso-2022-jp
|
| "csiso2022jp"
|
| "iso-2022-jp"
|
|
| shift_jis
|
| "csshiftjis"
|
| "ms_kanji"
|
| "shift-jis"
|
| "shift_jis"
|
| "sjis"
|
| "windows-31j"
|
| "x-sjis"
|
|
遗留的多字节韩语编码:
| euc-kr
|
| "cseuckr"
|
| "csksc56011987"
|
| "euc-kr"
|
| "iso-ir-149"
|
| "korean"
|
| "ks_c_5601-1987"
|
| "ks_c_5601-1989"
|
| "ksc5601"
|
| "ksc_5601"
|
| "windows-949"
|
|
| iso-2022-kr
|
| "csiso2022kr"
|
| "iso-2022-kr"
|
|
遗留杂项编码:
注意:所有的编码和它们的标签也可以作为非规范化的encodings.json 资源。
索引
大多数遗留编码使用索引。索引是一组有序的指针和相应的代码点。在索引指针内是独一无二的同时代码点可以被复制的。
To find the pointers and their corresponding code points in an index, let lines be the result of splitting the resource's contents on U+000A. Then remove each item in lines that is the empty string or starts with U+0023. Then the pointers and their corresponding code points are found by splitting each item in lines on U+0009. The first subitem is the pointer (as a decimal number) and the second is the corresponding code point (as a hexadecimal number). Other subitems are not relevant.