zoukankan      html  css  js  c++  java
  • ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别

     

         最近老为编码问题而烦燥,下定决心一定要将其弄明白!本文主要总 结网上一些朋友提供的 ascii,ISO-8859-1,unicode, utf8,gb2312,big5,gbk,gb18030等几种常区别.
        

    1. ASCII
        目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局 (ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。

         我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字 符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可 以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

    ASCII

    ASCII

    控制字符

    ASCII

    控制字符

    ASCII

    控制字符

    ASCII

    控制字符

    0

    NUL

    32

    (space)

    64

    @

    96

    1

    SOH

    33

    65

    A

    97

    a

    2

    STX

    34

    66

    B

    98

    b

    3

    ETX

    35

    #

    67

    C

    99

    c

    4

    EOT

    36

    $

    68

    D

    100

    d

    5

    ENQ

    37

    %

    69

    E

    101

    e

    6

    ACK

    38

    &

    70

    F

    102

    f

    7

    BEL

    39

    ,

    71

    G

    103

    g

    8

    BS

    40

    (

    72

    H

    104

    h

    9

    HT

    41

    )

    73

    I

    105

    i

    10

    LF

    42

    *

    74

    J

    106

    j

    11

    VT

    43

    +

    75

    K

    107

    k

    12

    FF

    44

    ,

    76

    L

    108

    l

    13

    CR

    45

    -

    77

    M

    109

    m

    14

    SO

    46

    .

    78

    N

    110

    n

    15

    SI

    47

    /

    79

    O

    111

    o

    16

    DLE

    48

    0

    80

    P

    112

    p

    17

    DCI

    49

    1

    81

    Q

    113

    q

    18

    DC2

    50

    2

    82

    R

    114

    r

    19

    DC3

    51

    3

    83

    X

    115

    s

    20

    DC4

    52

    4

    84

    T

    116

    t

    21

    NAK

    53

    5

    85

    U

    117

    u

    22

    SYN

    54

    6

    86

    V

    118

    v

    23

    TB

    55

    7

    87

    W

    119

    w

    24

    CAN

    56

    8

    88

    X

    120

    x

    25

    EM

    57

    9

    89

    Y

    121

    y

    26

    SUB

    58

    :

    90

    Z

    122

    z

    27

    ESC

    59

    ;

    91

    [

    123

    {

    28

    FS

    60

    92

    "

    124

    |

    29

    GS

    61

    =

    93

    ]

    125

    }

    30

    RS

    62

    94

    ^

    126

    ~

    31

    US

    63

    ?

    95

    127

    DEL

    NUL 空字符(Null

    VT 垂直制表

    SYN 空转同步

    SOH  标题开始

    FF   走纸控制

    ETB  信息组传送结束

    STX  正文开始

    CR   回车

    CAN  作废

    ETX  正文结束

    SO   移位输出

    EM   纸尽

    EOY  传输结束

    SI    移位输入

    SUB  换置

    ENQ  询问字符

    DLE  空格

    ESC  换码

    ACK  承认

    DC1  设备控制1

    FS   文字分隔符

    BEL  报警

    DC2  设备控制2

    GS   组分隔符

    BS   退一格

    DC3  设备控制3

    RS   记录分隔符

    HT   横向列表

    DC4  设备控制4

    US   单元分隔符

    LF   换行

    NAK  否定

    DEL  删除

    英语用128个符号编码 就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利 用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多 256个符号。

    但是,这里又出现了新的 问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中 却代表了字母Gimel (ג),在俄语编码中又会 代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段,所以出现后面的统一编码方式。

    注:

    若想得到更详细的参见 http://ascii.911cha.com/

    2、各地的方言

    在中国,大陆最常用的就 是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。

    字符必须编码后才能被计 算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,但为了处理汉字,又设计出用于简体中文的GB2312和用 于繁体中文的big5。

    GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个 其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

    GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了 21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。

    从ASCII、 GB2312到GBK,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以 统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK都属于双字节字符集 (DBCS)。

    2000年的GB18030是取代GBK1.0的正式国家标准。该标准 收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉 字的基础上增加了CJK扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。

    CJK就是中日韩的意思。Unicode为了节省码位,将中日韩三国 语言中的文字统一编码。GB13000.1就是ISO/IEC 10646-1的中文版,相当于Unicode 1.1。

    GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和 GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。例如:UCS的0x3400在GB18030中的编码应该是 8139EF30,UCS的0x3401在GB18030中的编码应该是8139EF31。

    微软提供了 GB18030的升级包,但这个升级包只是提供了一套支持CJK扩展A的6582个汉字的新字体:新宋体-18030,并不改变内码。Windows 的内码仍然是GBK。

    也就是 说Big5支持繁体中文,GB2312支持简体中文,Big5,GB2312是GBK的子集,GBK是GB18030的子集

    日本:SJIS编码

    注:

    汉字编码简明对照表 http://www.knowsky.com/resource/gb2312tbm.htm

    3、Unicode

    如果把各种文字编码形容 为各地的方言,那么Unicode就是世界各国合作开发的一种语言。

    在这种语言环境下,不会 再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。

    那么Unicode是如 何编码的呢?其实非常简单。

    就是将世界上所有的文字 用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?

    Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。现在用的是UCS-2,即2个字节编码.

    以现在的发展肯定是不够 用得,如《康熙字典》收录了四万七千零三十五字,《汉语大字典》收录了五万六千多个。到目前为止,国际标准组织(ISO)制定国际标准时,共收集到汉字七 万多字,所以出现UCS-4, 即4个字节编码,由原先的65536个编码扩展至将近100万编码。

    注:

    中日韩汉字 Unicode编码表:http://www.chi2ko.com/tool/CJK.htm

    查询需要Unicode 编码的字符:

    http://www.unicode.org/charts/unihan.html

    http://www.nengcha.com/code/unicode/

    4、兼容codepage

    那么既然统一了编码,如 何兼容原先各国的文字编码呢?这个时候就需要codepage了。

    什么是codepage?codepage 就是各国的文字编码和Unicode之间的映射表。比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表。

    以下是几个常用的codepage,相应的修改上面的地址的数字即可。

    codepage=936 简体中文GBK

    codepage=950 繁体中文BIG5

    codepage=437 美国/加拿大英语

    codepage=932 日文

    codepage=949 韩文

    codepage=866 俄文

    codepage=65001 unicode UFT-8

    从936中随意取一行, 例如:0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH.前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换

    5、UTF-8

    现在明白了 Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?

    Unicode的最初目标,是用1个16位的编码来为超过65000字符提供 映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题,尤其在那些基于网络的应用中。 

     因此,Unicode用一些基本的保留字符制定了三套编码方 式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这 种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41. 

    例:11100100 10111101 10100000à0xE4BDA0 “你”字的UTF-8编码

    01001111 01100000        à0x4F60  “你”的Unicode编码

    按照UTF-8的编码规 则,11100100 10111101 10100000分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,01001111 01100000就变成“你”的Unicode编码了.注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的经过UTF-8编码之后, 再也不会出现敏感字符了,因为最高位始终为1。

    Unicode和UTF-8之间的转换关系表:

    0000 0000-0000 007F | 0xxxxxxx

    0000 0000-0080 07FF | 110xxxxx 10xxxxxx

    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx   

    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中 就变成UTF-8了。

  • 相关阅读:
    关于链表的代码
    c++中的友元函数
    javaweb笔记全套
    包装类、object、单例模式、final、抽象类
    Linux变量内容的删除、代替与替换
    2014年工作中遇到的20个问题:181-200
    Qt中 QString 和int,double等的转换
    jsp学习笔记总结
    工作日志2014-07-04
    Maple入门使用教程
  • 原文地址:https://www.cnblogs.com/bestdqf/p/1765767.html
Copyright © 2011-2022 走看看