zoukankan      html  css  js  c++  java
  • ISO2022ISO 2022

    对于像中文,日文,韩文这样的文字,无法只用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]。

    赋予程序生命,还我自由河山!~ --CosMosGhost
  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/anmoon/p/1799968.html
Copyright © 2011-2022 走看看