对于像中文,日文,韩文这样的文字,无法只用8位来表示所有的字符。ISO 2022提供了这样一种技术,它能在一种字符编码中支持多种字符集,可以用8位或16位来表示一个文字(字符),是一种变长的编码,这样,就能表示所有的上述东亚字符了。该编码还有个显著的特点,就是所有的字节都是以0开始(ASCII的0-127部分),有效位数是7,所以在网络传输中,可以只传7位。但同时出现了一个问题,如何区分哪些是ACSII部分的字符,哪些是东亚字符?
ISO 2022用到的是标号(designations )和变换函数(shift functions)。 标号又称ESC序列(escape sequence),是一串以ASCII的ESC(ox1B)开头的字符串,特定的字符串指明所用的字符集。变换函数指明以何种方式解释接下来的字符,包括以何种字符集解释,解释多长的字节(接下来的两个字节或所有新的变换出现前的字节)。 下面介绍一下ISO-2022-CN(中文),ISO-2022-JP(日文),以及ISO-2022-KR(韩文)的实现方式。
2.3.1 ISO-2022-CN
ISO-2022-CN有3种标号:SO标号,SS2标号和SS3 标号(SS3只出现于ISO-2022-CN-EXT中)。SO标号的形式是ESC $ )
,其中
表示终结字符,由ISO指定。SS2标号的形式是ESC $ *
,SS3标号的形式是ESC $ +
。新出现的同种标号会覆盖前面的标号,如SO标号ESC $ ) A可以覆盖之前出现的SO标号ESC $ ) G,接下来的出现在SO变换后的字符将由新的SO标号指定的字符集来解码。
ISO-2022-CN有4种变换:SI,SO,SS2,SS3(SS3变换只出现于ISO-2022-CN-EXT中)。
SI变换由一个字节ox0F指定,表明后面的字节都应该解释为ASCII,直到遇到另一个变换。文本以SI为默认的变换,没有出现其它SI变换时,所有字节都将被解释为ASCII,即文本以ACSII字符开头。对于文本的每一行,若有汉字字符存在,一定要指定一个SO标号,即上一行指定的标号在本行不起作用。在行结束之前,一定要变换到ASCII(SI),当然若本行不含汉字字符,就不需要这样的变换了,整个一行都是ASCII字符(关于ISO-2022-CN的形式语法,详见RFC 1922 7.1节)[5]。
SO变换由一个字节ox0E指定,表明接下来的字节由SO标号指定的字符集来解释。
SS2变换由两个字节ox1B4E指定,表明接下来两个字节由SS2标号指定的字符集来解释,之后的字节又将由之前定义的变换来解释(SI或SO)。
SS3变换由两个字节ox1B4F指定,表明接下来两个字节由SS3标号指定的字符集来解释,之后的字节又将由之前定义的变换来解释(SI或SO)。
该编码支持的字符集有ASCII,GB2312,CNS 11643-plane-1和CNS 11643-plane-2。
ISO-2022-CN所用的标号,变换函数,以及支持的字符集如表2-2所示,标号含义如表2-3所示。
表2-2 ISO-2022-CN 字符集变换函数对应表
字符集 变换函数
ASCII SI
GB 2312, CNS 11643-plane-1 SO
CNS 11643-plane-2 SS2
表2-3标号含义
ESC $ ) A 表明在SO变换后的字节是由GB2312编码的汉字字符,直至出现另一个SO标号。
ESC $ ) G 表明在SO变换后的字节是由CNS 11643-plane-1编码的汉字字符,直至出现另一个SO标号。
ESC $ * H 表明紧接在SS2变换后的两个字节是由CNS 11643-plane-2编码的汉字字符,直至出现另一个SS2标号。
ISO-2022-CN-EXT是对ISO-2022-CN的一个扩展,支持汉字字符集:GB, Big5和CNS 11643,详见RFC 1922[5]。
2.3.2 ISO-2022-JP
ISO-2022-JP比ISO-2022-CN出现更早,与ISO-2022-CN类似,但更简单些,因为它没有用到变换函数,只用到了标号。标号(ESC序列)与字符集之间的对应关系如表2-4所示。
表2-4 ISO-2022-JP标号字符集对应表
ESC 序列 字符集
ESC ( B ASCII
ESC ( J JIS X 0201-1976 ("Roman" set)
ESC $ @ JIS X 0208-1978
ESC $ B JIS X 0208-1983
JIS X 0201与ASCII基本相同,除了两个字符:反斜线符号(backslash)和tilde (~)。backslash被日元符号代替,tilde被overline代替。
JIS X 0208 字符集包括日本汉字,平假名,片假名和其它一些符号和字符。
若一行中含有JIS X 0208字符集,则在该行结束前,需要转换到ASCII或JIS X 0201字符集,这个转换指明了下一行开始所用的字符集。文本必须以ASCII结束,关于ISO-2022-JP的形式语法,详见RFC 1468[6]。
2.3.3 ISO-2022-KR
ISO-2022-KR也有标号和变换函数,如表2-5所示:
表2-5 ISO-2022-KR变换函数字符集对应关系及标号意义表
SO KSC 5601
SI ASCII
ESC $ ) C 在第一个SO变换出现前的某一行的开始出现一次
KSC 5601字符集包括Hangul,Hanja,图形和一些其它外来字符,每个字符由两个字节组成。
ESC $ ) C标号的出现表明将要出现KSC 5601字符集中的字符,至多出现一次。若未出现,表明所有的字符都是ASCII。关于ISO-2022-KR的形式语法,详见RFC 1557[7]。