• 中文编码的相关问题


    转载声明http://www.2cto.com/kf/201304/206967.html

    ASCII-----单字节编码
    ASCII 码是使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。 ASCII 编码可以表示的最大字符数年是 256,其实英文字符并没有那么多,一般只用前 128 个(最高位为了0),其中包括了控制字符、数字、大小写字母和其他一些符号。而最高为1 的另128 个字符为“扩展ACSII”。
    128 个字符,其中0x00~0x1F(0~31))、0x7F(127)是控制符。其他编码 0x20~0x7E(32~126)则定义实际可见的字符,包括数字、大小写英文字母、标点符号等。


    GB2312-----中国人的简体字编码
    GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从 A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312-80中共收录了7545个字符,用两个字节编码一个字符。每个字符最高位为0。
    GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。
    GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。


    GBK----中国人的简繁编码
    GBK编码(Chinese Internal Code Specification)是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。
    范围:8140~FEFE(剔除xx7F)共23940个码位。GBK中有码位23940个,包含汉字21003个。
    GBK 采用了单双字节混合的方式。它兼容ASCII,因些0x~07F 部分的定义和ASCII 一样。对其他字符,GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254)-----最高位必须是 1,第二个字节的范围是0x40-0xFE(即64-254)。
     解码时,需要逐个字节检查具体如下:
    1.如果这个字节的范围是 0x00~0x7F,即最高位是 0 时,这个字节本身就代表一个字符,和 ASCII 的含义相同。
    2.如果字节范围 0x80~0xFF,即最高位为 1 时,还需要再取下一个字节,两个字节合起来才表示一个字符。


    Unicode----统一码、万国码,java、python
    Unicode编码后的大小是一样的.例如一个英文字母 "a" 和 一个汉字 "好",编码后都是占用的空间大小是一样的,都是两个字节!
    需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。


    UTF-8-----国际编码,通用性好,前缀码,从第一个字节就能知道这是个几字节字
    因为对于英文字母,unicode也需要两个字节来表示。unicode不便于传输和存储,因此而产生了utf编码。
    UTF8编码后的大小是不一定,例如一个英文字母"a" 和 一个汉字 "好",编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!编码的方法是从低位到高位。
    其中UTF-16和Unicode编码大致一样, UTF-8就是以8位为单元对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
    Unicode编码(16进制) UTF-8 字节流(二进制)
    U+0000 - U+007F         0*** ****(0x00~0x7F)                                       字节最高位为了0,则它表示一个字符,和ASCII 解释一样
    U+0080 - U+07FF         110* **** 10** ****(0xC0~0xDF)                      字节最高三位是110,则这是双字节 编码,用于其他字母字符
    U+0800 - U+FFFF         1110 **** 10** **** 10** ****(0xE0~0xEF)        字节最高四位是 1110, 则这是三字节编码,用于其他字符,如中文简繁等
    例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

  • 相关阅读:
    LeetCode OJ String to Integer (atoi) 字符串转数字
    HDU 1005 Number Sequence(AC代码)
    HDU 1004 Let the Balloon Rise(AC代码)
    HDU 1003 Max Sum(AC代码)
    012 Integer to Roman 整数转换成罗马数字
    011 Container With Most Water 盛最多水的容器
    010 Regular Expression Matching 正则表达式匹配
    007 Reverse Integer 旋转整数
    006 ZigZag Conversion
    005 Longest Palindromic Substring 最长回文子串
  • 原文地址:https://www.cnblogs.com/cton/p/3614641.html
Copyright © 2020-2023  润新知