C# 字符集编码简解

来源:互联网 发布:新型网络犯罪案例分析 编辑:程序博客网 时间:2024/04/27 04:14

GB2312 字符集

  • GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。
  • GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。
  • GB2312中对所收汉字进行了“分区”处理,共分为每区含有94个汉字/符号。这种表示方式也称为区位码。
  • 各区包含的字符如下:01-09区为特殊符号;16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序;10-15区及88-94区则未有编码。
  • GB2312是双字节编码,即一个GB2312编码的字符占2个字节。习惯上称第一字节为“高字节” ,而称第二字节为“低字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用0xA1-0xFE(把01-94加上0xA0)。GB2312高字节 = “区号”+160 ,GB2312低字节 = "位号" + 160。
  • 以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字GB2312编码为0xB0A1。计算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。
  • 所以如果我们求汉字区位码的话,我们可以通过求出该字的GB2312编码,然后将该编码的高字节与低字节分别减去160(0XA0)
       byte[] byteArray = System.Text.Encoding.GetEncoding("GB2312").GetBytes("啊");       foreach (byte b in byteArray)       {          codeStr += Convert.ToString(b - 160);    // 获取的就是汉字"啊"区位码       }

GBK字符集

  • GBK字符集是GB2312的扩展(K),向下完全兼容GB2312,GBK1.0收录了21886个符号,它分为汉字区和图形符号区,汉字区包括21003个字符。GBK字符集主要扩展了繁体中文字的支持及GB2312不包含的汉字部首符号、竖排标点符号等字符。
  • GBK有一字节和双字节编码,单字节编码范围为00-7F,和ASCII保持一致。双字节的整体编码范围是为0x8140-0xFEFE,不包括低字节是0x7F的组合。高字节范围是0x81-0xFE,低字节范围是0x40-7E和0x80-0xFE。

GB18030字符集

  • GB18030的全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。GB18030字符集标准的出台经过广泛参与和论证,来自国内外知名信息技术行业的公司,信息产业部和原国家质量技术监督局联合实施。
  • GB18030字符集标准解决汉字、日文假名、朝鲜语和中国少数民族文字组成的大字符集计算机编码问题。该标准的字符总编码空间超过150万个编码位,收录了27484个汉字,覆盖中文、日文、朝鲜语和中国少数民族文字。满足中国大陆、香港、台湾、日本和韩国等东亚地区信息交换多文种、大字量、多用途、统一编码格式的要求。并且与Unicode 3.0版本兼容,填补Unicode扩展字符字汇“统一汉字扩展A”的内容。并且与以前的国家字符编码标准(GB2312,GB13000.1)兼容。
  • 目前,GB18030有两个版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。
  • GB18030编码是变长编码,有单字节、双字节和四字节三种方式。GB18030的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节的编码范围是0x40-0x7E和0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是0x30-0x39。
ASCII字符集
  • ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于罗马字母表的一套电脑编码系统。
  • 标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符,共128字符。在标准ASCII中,其最高位(b7)用作奇偶校验位。为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。ASCII扩展字符集比ASCII字符集扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号

BIG5字符集

  • BIG5又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。
  • Big5码使用了双字节储存方法,一个字符占2个字节。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

Unicode字符集(UCS)

  • Unicode字符集编码是(Universal Multiple-Octet Coded Character Set )通用多八位编码字符集的简称,是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 
  • Unicode固定为双字节编码,共可以表示65536个字符 。
  • big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian(大尾)。还是将49写在前面,就是little endian(小尾)。 
  • 包含汉字(Han ideographs)的区块有:

    • CJK统一表意文字(4E00-9FFF):常用汉字(中文)
    • CJK统一表意文字扩展A3400-4DBF):罕用汉字
    • CJK统一表意文字扩展B20000-2A6DF):罕用汉字
    • CJK统一表意文字扩展C2A700-2B73F):罕用汉字
    • CJK兼容表意文字(F900-FAFF):重复字符,可统一的异形字
    • CJK兼容表意文字补充(2F800-2FA1F):可统一的异形字

UTF-8 编码

  • UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。所以UTF-8是Unicode的其中一个使用方式。
  • UTF-8以字节为编码单元,没有字节序的问题。它使用可变长度字节来储存 Unicode字符,ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节,辅助平面字符则使用4字节。(UTF-8编码的最大长度是4个字节)
  • Unicode编码(16进制)   ║ UTF-8 字节流(二进制)
        000000 - 00007F   ║     0xxxxxxx
        000080 - 0007FF   ║     110xxxxx 10xxxxxx
        000800 - 00FFFF   ║     1110xxxx 10xxxxxx 10xxxxxx
     010000 - 10FFFF   ║     11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 例如:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
  • UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAKSPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到87.以EF BBBF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。

UTF-16编码

  • 标准的 Unicode 称为UTF-16(UTF:UCS Transformation Format )。
  • UTF-16以两个字节为编码单元。需要首先清楚每个编码单元的字节序。Unicode规范中推荐的标记字节顺序的方法是BOM(Byte order Mark)。
  • 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAKSPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

编码识别方法:

最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:
{EF BB BF} UTF-8(带BOM)
{FE FF} UTF-16/UCS-2, little endian
{FF FE}UTF-16/UCS-2, big endian
{FF FE 00 00}UTF-32/UCS-4, little endian.
{00 00 FE FF} UTF-32/UCS-4, big-endian.

注意:UTF8、UTF16只是Unicode字符集的编码方式,我们不能直接将GB2312、GBK、GB18030等编码字符直接转换成UTF8、UTF16,需要先转换成Unicode

GBK、GB2312--Unicode--UTF8

UTF8--Unicode--GBK、GB2312


原创粉丝点击