ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别(转载)

摘要:
它适用于所有拉丁字母。ASCII码有两种形式:7位码和8位码。早期的计算机使用7位ASCII编码,但为了处理汉字,设计了简体中文的GB2312和繁体中文的big5。2000年的GB18030是取代GBK1.0的官方国家标准。为了节省代码位,Unicode用中国、日本和韩国的语言对字符进行编码。GB13000.1是ISO/IEC10646-1的中文版本,相当于Unicode 1.1。GB18030采用单字节、双字节和4字节编码方案。

原文出处:http://www.blogjava.net/xcp/archive/2009/10/29/coding2.html

 最近老为编码问题而烦燥,下定决心一定要将其弄明白!本文主要总结网上一些朋友提供的 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了。

免责声明:文章转载自《ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别(转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇请使用-Xlint:deprecation重新编译nginx配置详情(总结)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

LaTex支持中文的三种方式(首推第一种)

转自:https://blog.csdn.net/z_feng12489/article/details/90449495 我们知道 Latex 一般用 CJK 和 CTEX 宏包支持中文编辑,CJK 和 CTEX 的默认编码是 GBK,而 windows 下的默然编码就是 GBK,因此 CJK 和 CTEX 不需要特殊配置就可以直接支持中文 Latex...

Unicode基本概念

Unicode是计算机可以支持这个星球上多种语言的秘密武器。通过使用一个或者多个字节来表示一个字符的方法突破了ASCII的限制。Unicode可以表示超过90000个字符。 使用方式:a=u'hello' #Unicode String String的内建函数str()和chr()并没有升级来处理Unicode,新的内建函数unicode()和unichar...

(转)字符编码笔记:ASCII,Unicode和UTF8

今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料。 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚。 下面就是我的笔记,主要用来整理自己的思路。但是,我尽量试图写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识。 1. ASCII...

BASE64编码的图片在网页中的显示问题的解决

BASE64位转码有两种: 一种是图片转为Base64编码,这种编码是直接可以在页面通过<img src='http://t.zoukankan.com/base64编码'/>的方式显示 Base64 在CSS中的使用 .demoImg{ background-image: url("data:image/jpg;base64,/9j/4QMZ...

node爬虫爬取中文时乱码问题 | nodejs gb2312、GBK中文乱码解决方法

iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码。 老外写了一个通过纯Javascript转换编码的模块 iconv-lite 可以实现window下的转换 ,通过npm可以安装此模块,bufferhelper是一个操作buffer的加强类 首先安装 npm ins...

Eric6安装问题解决

按照http://eric-ide.python-projects.org/eric-download.html中的说明,执行命令:python install.py 却遇到下面的问题: Compiling source files ...   File "C:Users中文名AppDataLocalProgramsPythonPython36Libsit...