java编码知识详解

java编码知识详解

简介

计算机的本质就是二进制,所以对计算机下达的所有指令最终都会转换为0,1代表的二进制数,比如数字,汉语,符号最终对应的都是二进制数,但是具体哪个符号对应哪个二进制数,就要有一套标准来规范,不同的标准就是不同的编码方式。
目前java语言中常用的编码方式是ASCII、ISO-8859-1、GBK、UTF-8、UTF-16其余的编码方式不做讨论,现在就来说说这几种编码方式。

ASCII

ASCII码(美国标准信息交换码)是由美国国家标准局制定的,ASCII码用计算机中的一个字节(8位)来编码,所以ASCII码是单字节编码,一个字节有8位,ASCII码用7位来进行编码,第八位用0表示。所以7位总共是128个,从0000 0000到0111 1111代表从0~127的数字,每个数都对应相应的符号,来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。比如小写‘a’,对应的就是97,这个对应表用到时候去查下就可以了。

ISO-8859-1

ASCII码只能表示128个字符,其他的字符怎么表示了?所以这里就出现了 ISO-8859-1编码方式, ISO-8859-1也是单字节编码,是对ASCII码的补充,除了能表示ASCII码以外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。表示的范围是0~255,总共能表示256个字符,即在ASCII码的基础上,对一个字节的高位也加入了编码。Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。所以以后出现Latin-1编码,不要说不认识哦。

GBK

上面的两种编码方式都是能编码外国人用的字符,那我大中国的汉语怎么办,所以,我们想了想不行,我们也得为我们的汉语来进行编码,总不能我们中国人写代码都得用英语吧,所以中华人民共和国全国信息技术标准化技术委员会就制定了这个标准,叫做GBK。GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。双字节编码范围有65536,即2的16次方,完全可以放下大部分的汉字。

unicode

上面我们说到了GBK是因为ASCII码不能表示汉语而出现的编码方式,那么这个是解决了汉语问题,那么日语,俄语,韩语世界上很多其他语言,难道每个语言都要弄一个自己的编码吗?为了解决这个问题unicede就应运而生了,他收录了几乎全球上所有的符,这样就不会再有不同的语言用不同的编码方式而发生乱码问题了。Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。

UTF-8

虽然unicode解决了乱码的问题,但是所有的编码都成了双字节,那些用英文的国家的就不开森了,明明我们一个字节就能解决的问题,干嘛多弄一个字节,费时费力的,于是他们就在unicode的基础上发明了UTF-8,他们的思想就是可以变长编码。当我是英文字符的时候就是一个字节,其他字符就是按相应unicode编码的范围来决定字节了,我们的汉语基本都在三字节编码的范围之内。
01就是代表标志位,xxx就是代表具体的编码范围
0xxxxxxx 代表1字节编码,范围就是0~127
110xxxxx 10xxxxxx 代表2字节编码,128~2048也就是几个xxx,代表2的多少次
1110xxxx 10xxxxxx 10xxxxxx 代表三字节编码 2049~65535
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 以此类推
这样UTF-8就生成了,所以他和unicode的关系就是在unicode的基础上,应用标志位来进行变长编码,这样子老外就开心了,他们的英文还是一个字节来编码了。

UTF-16

UTF-16就是使用了双字节编码,相当于把unicode搬了过来,这样子在使用大量中文字符的时候我们就可以使用UTF-16编码,因为UTF-8中文是三个字符,即节省了空间又和国际接轨。

猜你喜欢

转载自blog.csdn.net/weixin_44130081/article/details/89844075