字符编码(ASCII、ANSI、GB2312、UTF-8等)系统梳理

引言

在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。那么字母”A”在硬盘上是如何存储的呢?

可能小张计算机存储字母”A”是1100001,而小王存储字母”A”是11000010,这样双方交换信息时就会误解。比如小张把1100001发送给小王,小王并不认为1100001是字母”A”,可能认为这是字母”X”,于是小王在用记事本访问存储在硬盘上的1100001时,在屏幕上显示的就是字母”X”。也就是说,小张和小王使用了不同的编码表。小张用的编码表是ASCII,ASCII编码表把26个字母都一一的对应到2进制1和0上;小王用的编码表可能是EBCDIC,只不过EBCDIC编码与ASCII编码中的字母和01的对应关系不同。

一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,而大型主机系统(MVS、OS/390等)采用EBCDIC 编码。在发送数据给对方前,需要事先告知对方自己所使用的编码,或者通过转码,使不同编码方案的两个系统可沟通自如。

ASCII编码

ASCII是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646

请注意,ASCII是American Standard Code for Information Interchange缩写,而不是ASC2,有很多人在这个地方产生误解。

ASCII 码使用指定的7 位或8 位二进制数组合来表示128或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。其中:

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。

65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

标准ASCII码如下:


二进制


十进制


十六进制


缩写/字符


解释


0000 0000


0


00


NUL(null)


空字符


0000 0001


1


01


SOH(start of headline)


标题开始


0000 0010


2


02


STX (start of text)


正文开始


0000 0011


3


03


ETX (end of text)


正文结束


0000 0100


4


04


EOT (end of transmission)


传输结束


0000 0101


5


05


ENQ (enquiry)


请求


0000 0110


6


06


ACK (acknowledge)


收到通知


0000 0111


7


07


BEL (bell)


响铃


0000 1000


8


08


BS (backspace)


退格


0000 1001


9


09


HT (horizontal tab)


水平制表符


0000 1010


10


0A


LF (NL line feed, new line)


换行键


0000 1011


11


0B


VT (vertical tab)


垂直制表符


0000 1100


12


0C


FF (NP form feed, new page)


换页键


0000 1101


13


0D


CR (carriage return)


回车键


0000 1110


14


0E


SO (shift out)


不用切换


0000 1111


15


0F


SI (shift in)


启用切换


0001 0000


16


10


DLE (data link escape)


数据链路转义


0001 0001


17


11


DC1 (device control 1)


设备控制1


0001 0010


18


12


DC2 (device control 2)


设备控制2


0001 0011


19


13


DC3 (device control 3)


设备控制3


0001 0100


20


14


DC4 (device control 4)


设备控制4


0001 0101


21


15


NAK (negative acknowledge)


拒绝接收


0001 0110


22


16


SYN (synchronous idle)


同步空闲


0001 0111


23


17


ETB (end of trans. block)


传输块结束


0001 1000


24


18


CAN (cancel)


取消


0001 1001


25


19


EM (end of medium)


介质中断


0001 1010


26


1A


SUB (substitute)


替补


0001 1011


27


1B


ESC (escape)


换码(溢出)


0001 1100


28


1C


FS (file separator)


文件分割符


0001 1101


29


1D


GS (group separator)


分组符


0001 1110


30


1E


RS (record separator)


记录分离符


0001 1111


31


1F


US (unit separator)


单元分隔符


0010 0000


32


20


(space)


空格


0010 0001


33


21


!


 


0010 0010


34


22


"


 


0010 0011


35


23


#


 


0010 0100


36


24


$


 


0010 0101


37


25


%


 


0010 0110


38


26


&


 


0010 0111


39


27



 


0010 1000


40


28


(


 


0010 1001


41


29


)


 


0010 1010


42


2A


*


 


0010 1011


43


2B


+


 


0010 1100


44


2C


,


 


0010 1101


45


2D


-


 


0010 1110


46


2E


.


 


00101111


47


2F


/


 


00110000


48


30


0


 


00110001


49


31


1


 


 


00110010


50


32


2


 


 


00110011


51


33


3


 


 


00110100


52


34


4


 


 


00110101


53


35


5


 


 


00110110


54


36


6


 


 


00110111


55


37


7


 


 


00111000


56


38


8


 


 


00111001


57


39


9


 


 


00111010


58


3A


:


 


 


00111011


59


3B


;


 


 


00111100


60


3C


<


 


 


00111101


61


3D


=


 


 


00111110


62


3E


>


 


 


00111111


63


3F


?


 


 


01000000


64


40


@


 


 


01000001


65


41


A


 


 


01000010


66


42


B


 


 


01000011


67


43


C


 


 


01000100


68


44


D


 


 


01000101


69


45


E


 


 


01000110


70


46


F


 


 


01000111


71


47


G


 


 


01001000


72


48


H


 


 


01001001


73


49


I


 


 


01001010


74


4A


J


 


 


01001011


75


4B


K


 


 


01001100


76


4C


L


 


 


01001101


77


4D


M


 


 


01001110


78


4E


N


 


 


01001111


79


4F


O


 


 


01010000


80


50


P


 


 


01010001


81


51


Q


 


 


01010010


82


52


R


 


 


01010011


83


53


S


 


 


01010100


84


54


T


 


 


01010101


85


55


U


 


 


01010110


86


56


V


 


 


01010111


87


57


W


 


 


01011000


88


58


X


 


 


01011001


89


59


Y


 


 


01011010


90


5A


Z


 


 


01011011


91


5B


[


 


 


01011100


92


5C


\


 


 


01011101


93


5D


]


 


 


01011110


94


5E


^


 


 


01011111


95


5F


_


 


 


01100000


96


60


`


 


 


01100001


97


61


a


 


 


01100010


98


62


b


 


 


01100011


99


63


c


 


 


01100100


100


64


d


 


 


01100101


101


65


e


 


 


01100110


102


66


f


 


 


01100111


103


67


g


 


 


01101000


104


68


h


 


 


01101001


105


69


i


 


 


01101010


106


6A


j


 


 


01101011


107


6B


k


 


 


01101100


108


6C


l


 


 


01101101


109


6D


m


 


 


01101110


110


6E


n


 


 


01101111


111


6F


o


 


 


01110000


112


70


p


 


 


01110001


113


71


q


 


 


01110010


114


72


r


 


 


01110011


115


73


s


 


 


01110100


116


74


t


 


 


01110101


117


75


u


 


 


01110110


118


76


v


 


 


01110111


119


77


w


 


 


01111000


120


78


x


 


 


01111001


121


79


y


 


 


01111010


122


7A


z


 


 


01111011


123


7B


{


 


 


01111100


124


7C


|


 


 


01111101


125


7D


}


 


 


01111110


126


7E


~


 


 


01111111


127


7F


DEL (delete)


删除

ISO-8859-1编码

ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。

HTML 4.01 支持 ISO 8859-1(Latin-1) 字符集。

ISO-8859-1 的较低部分(从 1 到 127 之间的代码)是最初的7位 ASCII。

ISO-8859-1 的较高部分(从 160 到 255 之间的代码)全都有实体名称。

因为ISO-8859-1编码范围使用了单字节内的所有空间(即8位,0-255),在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。

Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。

ANSI 标准

ASCII是美国标准,所以它不能良好满足其它国家的需要。例如英国的英镑符号(£),拉丁语字母表重音符号,使用斯拉夫字母表的希腊语、希伯来语、阿拉伯语和俄语,还有汉字系统的中国象形汉字,日本语和朝鲜语等等。

多字节字符集 (MBCS,Multi-ByteChactacter Set) 是一种旧的方式以支持无法用单字节表示的字符集(如日文和中文)的方法。最常见的 MBCS 实现是双字节字符集 (DBCS,Double-Byte CharacterSet)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。

为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种延伸编码方式,称为ANSI 编码(AmericanNational Standards Institute,美国国家标准学会),也称为MBCS编码。在简体中文系统下,ANSI编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,所以在中文
windows下要转码成gb2312,gbk只需要把文本保存为ANSI 编码即可。

不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字。这样就容易造成混乱。导致了unicode码的诞生。

当然对于ANSI编码而言,0x00~0x7F(即十进制下的0到127)之间的字符,依旧是1个字节代表1个字符。这一点是ASNI编码与Unicode编码之间最大也最明显的区别。

GB2312编码

GB2312 是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集基本集》,标准号为GB 2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB 2312。

一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。

为避免同西文的存储发生冲突,GB2312字符在进行存储时,通过将原来的每个字节第8bit设置为1同西文加以区别,如果第8bit为0,则表示西文字符,否则表示GB2312中的字符

GB2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。

GBK编码

GB2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。GBK是对GB2312的扩展

GBK采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在40-FE 之间,剔除 xx7F一条线。总计23940 个码位,GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。

BIG-5编码

BIG-5码,又称为大五码或者五大码,是通行于台湾、香港地区的一个繁体字编码方案。相当于港台地区的GB2312编码,也是ANSI编码的一种

“五大码(大五码)”(Big5)是在1984年由台湾13家厂商与台湾地区财团法人信息工业策进会为五大中文套装软件(宏碁、神通、佳佳、零壹、大众)所设计的中文内码,所以就称为Big5中文内码

Unicode字符集

如上ANSI编码条例中所述,世界上存在着多种编码方式,在ANSI编码下,同一个编码值,在不同的编码体系里代表着不同的字。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,可能最终显示的是中文,也可能显示的是日文。在ANSI编码体系下,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者可能是日文的ANSI编码体系和信息的读取者可能是中文的编码体系,他们对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生。

如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。

通用字符集(UniversalCharacter Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC10646)标准所定义的标准字符集。编码层面上,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。     UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。

需要注意的是,Unicode只是一个字符集,它只规定了符号与二进制代码之间的对应关系,却没有规定这个二进制代码应该如何存储

比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

它们造成的结果是:1)出现了Unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示Unicode。2)Unicode在很长一段时间内无法推广,直到互联网的出现。

UTF-8编码

UTF-8是Unicode的实现方式之一。

UTF-8(UCSTransformation Format 8bit)就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上用的很少。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

从Unicode到UTF-8的编码方式如下:


Unicode编码(十六进制)


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字节模板了:

1110xxxx10xxxxxx 10xxxxxx。

将0x6C49写成二进制是:

0110 1100 01001001,

用这个比特流依次代替模板中的x,得到:

1110011010110001 10001001

即E6 B1 89就是“汉”的UTF-8码。

很多细心的人会发现,新建一个空的文本文件,用记事本打开(必须是Windows自带的记事本),只输入“联通”二字保存关闭,再重新打开时将是乱码。

在保存这个操作中,windows默认保存的编码是ANSI(实际上应该是GBK)。

这样联通这两个字的二进制内码是:(一个字占两个字节)

c1   1100 0001

aa   1010 1010

cd   1100 1101

a8   1010 1000

巧合的地方在于“联通”这两个字的ANSI编码符合UTF-8编码的第二个模板。

当txt文档中一切字符都在 C0≤AA(第一个字节)≤DF 80≤BB(第二个字节)≤BF 这个范围时,notepad都无法确认文档的格式,自动依照UTF-8格式来解码。而“联通”就是C1 AA CD A8,刚好在上面的范围内,所以不能正常显现。

假如保存时选择Unicode、Unicode (BigEndian)、UTF-8编码,就正常了。此外,假如以ANSI编码保存含有某些特别符号的文本文档,再次打开后符号也会变成英文问号。

Little endian和Big endian

UTF-8、UTF-16、UTF-32等显现了Unicode的编码方式,但是还有一个问题,编码后应该如何存储?

这里就要引出两个名词:

LE(littleendian):小字节字节序,意思就是一个单元在计算机中的存放时按照低位在前(低地址),高位在后(高地址)的模式存放。

BE(big endian):大字节字节序,和LE相反,是高位在前,低位在后。

比如一个unicode编码为:0x006C49,如果是LE,那么在文件中的存放顺序应该是:49 6c 00

如果是BE ,那么顺序应该是:00 6c49

这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。

那么很自然的,就会出现另一个一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?

Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(ZERO WIDTHNO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。这些编码在unicode 中是没有使用的,所以不用担心会冲突。

这种方式叫做BOM(Byte Order Mark)头。意思是字节序标志头。通过它基本能确定编码格式和字节序。

如果一个文本文件的头两个字节是FE FF,就表示该文件采用大字节字节序;如果头两个字节是FF FE,就表示该文件采用小字节字节序。

BOM检测不能保证100%准确,只能通过编码范围从概率上来检查,虽然准确度还是比较高,但是不能保证100%。所以,时常看到检测错误的软件,也不奇怪了。

时间: 2024-10-11 22:44:08

字符编码(ASCII、ANSI、GB2312、UTF-8等)系统梳理的相关文章

彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, Utf-8

彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, U 1.ASCII: 0-127(128-255未使用),美国标准 2.IS0-8859-1(latin-1): 0-255, 西欧国家等 3.GB2312:常用简体中文,双字节编码,国标,对于ASCII字符仍采用单字节编码 4.GBK: GB2312的超集,包含繁体,日韩,双字节编码,不是国标(新的国标GB18030-2000是GBK的超集) 5.BIG5:繁体中文,台湾,类似GB2312 6.S

PHP字符编码ASCII 、GB2312、GBK、UTF-8解释

变量命名规则:1.  变量名区分大小写(case-sensitive) .2.  必须字母或下划线开头.变量名可由 字母.数字.下划线组成.  看 到这里可能,很多人纳闷了~.那为啥  $我是变量    这样的中文也能做变量名呢? 在PHP里,中文的确是可以做变量名的(能用是能用但千万别项目上用....) . 因为这里的字母是指: a-z   A-Z  和  扩展ASCII 字符里从 127 到 255  ,16进制表示为:0x7f-0xff   . 那意思就是ASCII字符里从127到255

文字编码ASCII,GB2312,GBK,GB18030,UNICODE,UCS,UTF的解析

众所周知,一个文字从输入到显示到存储是有一个固定过程的,其过程为:输入码(根据输入法不同而不同)→机内码(根据语言环境不同而不同,不同的系统语言编码也不一样)→字型码(根据不同的字体而不同)→存储码(根据保存的编码类型不同而不同).不同的存储码之间又有什么异同呢? 一.ASCII系列编码 首先来说明ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),这个编码的时代就久远了,是由美国国家标准局(ANSI)制定,目

java中的常用字符编码ASCII、Unicode和UTF-8

首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今. ASCI

字符编码 ASCII,Unicode 和 UTF-8 概念扫盲

今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思路.但是,我尽量试图写得通俗易懂,希望能对其他朋友有用.毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出2

字符编码ASCII,Unicode和UTF-8

http://blog.csdn.net/pipisorry/article/details/42387045 ASCII码 ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001).这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0. 非ASCII编码 英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的.比如,在法语中,字母

字符编码 ASCII,Unicode 和 UTF-8扫盲

今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思路.但是,我尽量试图写得通俗易懂,希望能对其他朋友有用.毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出2

字符编码ASCII, Unicode和UTF-8

字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定

字符编码GBK、GB2312和UTF-8的区别与联系

在计算机系统内,文本信息的存储使用的ASC II码. 什么是ASC II码呢? ASC II码全称是"美国信息交换标准代码",从字面上我们就能知道,这是一套用于显示英语和西欧语种的编码体系. 它包含常用的英文字母.数字及一些特殊字符和控制符等共计127个字符,是最通用的单字节编码系统,即一个字符对应一个唯一的ASC II码. 随着个人计算机在全球的普及,很明显单字节的字符编码根本不能满足各个国家.各个语种的编码和显示需求,这个时候就需要针对不同语种定制不同的编码规范. GBK.GB23

php字符编码转换之gb2312转为utf8(转)

在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ( string in_charset, string out_charset, string str ) 注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符