java字符代码_java字符编码java语言使用的字符码集是
何为字符编码(名词):计算机中的任何信息它们都以0和1的⽅式存⼊计算机并得以处理,这些信息⽤哪些⼆进制数字来表⽰了,就需要⼀套规则,这套规则就是字符编码(Character Code),⽐如,同样⼀个字母'A',每种规范⾥⾯的表达存储⽅式不⼀样,ASCII是001,GB2312是002,没以下都是它的规则,如:ASCII编码表、GB2312编码表、GBK编码(即“国G标B”、“扩K展”前三个汉字的汉语拼⾳的第⼀个字母)、GB18030、Unicode编码、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 编码。在发送数据给对⽅前,需要事先告知对⽅⾃⼰所使⽤的编码,或者通过转码,使不同编码⽅案的两个系统可沟通⾃如。(其实发过来的都是0101010。。。,对⽅告知所使⽤的编码规范(假如是ASCII编码),就使⽤ASCII编码表到对应所表达的字符,再将字符通过EBCDIC编码表到对应的编码,然后才能得到本机正常情况下的字符)
这就解释了乱码的原因:010101在你那⾥代表正常的字符,你那边编码规范是ASCII编码,到我这边来编码规范是GB2312,编码表变了,010101代表什么西⽅字符或者问号等等,于是乱码⽂件就产⽣了
解码:你⽤⽂件编辑软件打开某个⽂件,假设⾥⾯装的010101,⽐如以UTF-8打开,就以UTF-8的语⾔包去解码010101,它代表刘德华,⽐如以GBK解码的语⾔包去解码010101,它代表梁朝伟
编码:名词即语⾔包,动词的话,就是UTF-8⽤010101编码(表⽰)刘德华,GBK以101010编码(表⽰)刘德华
转码:⽐如你之前使⽤GBK(2、3、4)打开的,现在我需要⽤UTF-8(5、6、7)打开
public static void convertionString() throwsUnsupportedEncodingException{
String s= "任何信息"; //计算机上的任何信息是以010101存在的 1
byte[] b = s.getBytes("gbk");//得到⽂件以GBK编码表存在的⽅式(字节) 2
String sa = new String(b, "gbk");//⽤GBK编码表去解码字节代表什么 3
System.out.println(sa + b.length + "\n"); //GBK编码下的结果 4
b = sa.getBytes("utf-8");得到⽂件以utf-8编码表存在的⽅式(字节) 5
sa = new String(b, "utf-8");//⽤utf-8编码表去解码字节代表什么 6
}
字符编码的发展
第⼀阶段:
计算机当时只⽀持英语,字符在计算机中都是以0和1的⽅式存储的。象a、b、c、d这样的52个字母(
包括⼤写)、以及0、1、 2等数字还有⼀些常⽤的符号(例如*、#、@等)在计算机中存储时也要使⽤⼆进制数来表⽰,⽽具体⽤哪些⼆进制数字表⽰哪个符号,就必须要有⼀定的规则, 于是美国有关的标准化组织就出台了所谓的ASCII编码,统⼀规定了上述常⽤符号⽤哪个⼆进制数来表⽰。ASCII码规定每个字符例如 “a”使⽤1个字节来表⽰,也就是8位的⼆进制组合,那么就有00000000-11111111⼀共256种组合,也就是可以表⽰256个不同的字符。
其中0-31:是控制字符或通讯专⽤字符(不可以显⽰的字符,其余为可显⽰字符),如控制符:LF(换⾏)、CR(回车)等。
32-126:是字符,其中32是空格,48-57为0-9的阿拉伯数字,65-90为26个⼤写英⽂字母,97-122为26个⼩写英⽂字母,其余的是⼀些标点符号,运算符号等。
ASSCII共计有128个,从0到127,也就是从00000000-01111111,最⾼位都是0。
ISO 8859-1它以ASCII为基础,在空置的0xA0-0xFF的范围内,加⼊96个字母及符号,藉以供使⽤变⾳符号的拉丁字母语⾔使⽤。
第⼆阶段:ANSI编码阶段(American National Standards Institute,美国国家标准学会的标准码)
ASCII只能表⽰英⽂字符,那么其他字符怎么表⽰呢?汉语是这样解决的,⽤两个ASCII表⽰⼀个汉字,
⽽且不⽤前⾯的128个,为什么不⽤已经在上⼀篇中介绍了,因为前128个是⼈家的英⽂。不能占啊,否则就混乱了。⽐如汉字“中”在中⽂操作系统中使⽤ [0xD6,0xD0] 这两个字节存储,为什么呢,这⾥简单解释⼀下,“中”的区位码是 54 48 ,那么“中”的,国标码就是54 48的⼗六进制+上
2020H=5650H,那么“中”的机内码就是=“中的国标码+8080H=D6D0H(这都是上⼀篇的内容,不明⽩的可以看上⼀ 篇),这样每个汉字也都有了⾃⼰的编码,汉字编码解决了,这就是中国的GB2312编码标准,但是这是中国汉字的编码,那么其他国家呢?其他的国家的计算 机操作系统中可能把[0xD6,0xD0] 这两个字节存储成他们的⽂字,⽽不是“中”,不同的国家和地区制定了不同的标准,这些使⽤ 2个字节来代表⼀个字符的各种⽂字延伸编码⽅式,称为ANSI 编码。
在简体中⽂系统下,ANSI 编码代表 GB2312 编码,在⽇⽂操作系统下,ANSI 编码代表 JIS 编码。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,⽆法将属于两种语⾔的⽂字,存储在同⼀段ANSI 编码的⽂本中。
第三阶段:Unicode(16进制)字符集编码阶段(Universal Multiple-Octet Coded Character Set, 通⽤多⼋位编码字符集的简称)
为了使国际间信息交流更加⽅便,国际组织制定了 UNICODE(16进制) 字符集, 为各种语⾔中的每⼀个字符设定了统⼀并且唯⼀的数字编号,以满⾜跨语⾔、跨平台进⾏⽂本转换、处理的要求。Unicode
固然统⼀了编码⽅式,但是它的效率不⾼,⽐如UCS-4(Unicode的标准之⼀)规定⽤4个字节存储⼀个符号,那么每个英⽂字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
UCS只是规定如何编码,并没有规定如何传输、保存这个编码。
UTF-8:utf(Unicode Translation Format)为了提⾼Unicode的编码效率,于是就出现了UTF-8编码。Unicode规定世界上每个字符对应的编码号,utf-8定义了如何存储字符,UTF-8使⽤可变长度字节来储存 Unicode字符,例如ASCII字母继续使⽤1字节储存,重⾳⽂字、希腊字母或西⾥尔字母等使⽤2字节来储存,⽽常⽤的汉字就要使⽤3字节。辅助平⾯字符则使⽤4字节。
UTF-16、UTF-32 都是将数字转换到程序数据的编码⽅案。
java在内存中运算是使⽤的双字节字符unicode的编码⽅式
内存中对字符串操作其实不⽤考虑字符集。
只有在读取到内存中,和输出时,需要考虑字符集转换。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。