因为String字符串很常用,所以我们在使用它的过程中,可能会面临各种问题,比如”中文乱码“问题等,那么为什么中文会乱码?本文将给大家介绍一下Java如何设置String字符串编码,来避免和解决这一常见问题,需要的朋友可以参考下
一. 字符编码
1. 编码简介
2. 常用编码
2.1 ASCII编码
2.2 GB2312编码
2.3 Big5编码
2.4 Unicode编码
2.5 UTF-8编码
2.6 GBK编码
二. String编码设置
1. 概述
2. 转换编码
三. 结语
一. 字符编码
1. 编码简介
对很多小白来说,可能不明白什么是字符编码,也不知道为什么要有字符编码,所以就先来给大家简要地介绍一下字符编码。
所谓的字符编码(Character Encoding),也叫做字集码,其实就是一种映射规则,计算机可以根据这个映射规则,将某个字符映射成其他形式的数据,以便在计算机和网络中进行存储和传输。
例如经典的ASCII字符编码,就是将字母、数字和其它符号进行编号,并用7个比特的二进制作为单字节的低位,然后再加一个额外扩充的比特占据高位,形成一个完整的字节,从而表示一个整数。在这个编码规则下,字母A的编号是65(ASCII码),用单字节表示就是0x41,而写入到存储设备时就是二进制的01000001。这样,A、65、0x41、01000001这四个数据之间就有了对应的映射关系。
有些同学就问了,怎么这么麻烦?直接把A存储在计算机中不行吗?这个肯定不行啊!之前跟大家讲解计算机基础知识时就说过,计算机的底层硬件只能识别电路信号,即开和关,转换成数字就是1和0,这就是二进制的由来。也就是说,计算机底层硬件只能识别0和1这两个数字,你给我存储”A“这个字符,肯定就不行咯。但是对我们人类来说,计算机直接把一堆0101展示在我们面前,我们又不是电路板,怎么可能识别?!所以这时候就需要在人类可读的数据,与计算机底层能够理解的数据之间有一种映射规则和关系,这种映射规则其实就是字符编码!
2. 常用编码
现在我们已经知道了字符编码的概念及其由来,有些同学又问了,都有哪些字符编码呢?接下来再跟大家聊几个常用的字符编码:
ASCII编码
GB2312编码
Big5编码
Unicode编码
UTF-8编码
GBK编码
当然,在实际的开发中,其实有很多种字符编码,以上这几个只是比较常用的字符编码。
2.1 ASCII编码
ASCII(American Standard Code for Information Interchange,美国信息交换标准码),是基于拉丁字母的字符编码系统,主要用于显示现代英语和其他西欧语言。 它是现今最通用、最经典的单字节编码系统,大多数的小型机和全部的个人计算机都会使用此码,可以说是字符编码中的ISO国际标准。
在ASCII编码中规定,用7个比特的二进制作为单字节的低位,然后再加一个额外扩充的比特占据高位,形成一个完整的字节,从而表示一个整数。该编码规定,大写的字母A编码是65,小写的字母a编码是97,后面字母的数值按顺序递增。
最初在ASCII编码表中,只有128个字符,包括大小写英文字母、数字、标点符号和32 个控制字符。后来又新增了128个字符,作为扩展的ASCII码,所以ASCII编码中共有256个字符。虽然ASCII编码中的字符也不少,但该表中关于字母和数字的记忆其实是非常简单的。我们只要记住一个字母或数字的ASCII 码(如A编码是65,a编码是97,0编码是48),然后记住相应的大小写字母之间相差32,就可以推算出其余字母的ASCII码。
但由于ASCII字符集中的字符数目有限,在现在的实际应用中是无法满足要求的,因此后来国际标准化组织制定了一个ISO2022标准。它在保证与ISO646兼容的前提下,ISO陆续制定了一批适用于不同国家和地区的扩展ASCII字符集,以满足实际需求。
2.2 GB2312编码
ACSII编码主要适用于英语等欧美语言,对于中文是不实用的,中文在ASCII编码环境中会以”乱码“显示。但是中文有这么大的使用需求,不可能用西文来存储和展示信息,我们需要一个针对中文的映射关系表,所以中国就制定了GB2312编码,用于存储和传输中文信息。
为了满足汉字的存储和传输需求,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为GB 2312-1980。该编码在中文国家使用非常普遍,包括国内和新加坡等地。
GB2312是一个简体中文字符集,该编码由6763个常用汉字和682个全角的非汉字字符组成,属于是ANSI编码里的一种,而ANSI编码又是对ASCII编码的扩充。但是该编码只包含简体中文,不包括繁体中文,所以港澳台地区并不使用本编码。
2.3 Big5编码
因为GB2312b不支持繁体字,所以为了支持繁体字,1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众,共同制定了一种繁体中文编码方案,所以被称为”五大码“,英文写作Big5。后来英文翻译回汉文后,习惯称其为”大五码“。目前该编码已经成了繁体字的标准码。
大五码是支持繁体中文汉字的字符集,包括13053个繁体字、808个标点符号、希腊字母及特殊符号。Big5字符主要包括标点符号、希腊字母及特殊符号、常用汉字、非常用汉字,其余部分保留给其他厂商支持。
2.4 Unicode编码
因为不同国家和地区使用的语言不同,而ASCII码只针对英语体系,所以ASCII出现之后的很长一段时间内,很多主流国家和地区都搞出了自己的一套或多套编码。如此以来,就会出现一个问题,各个主流国家都自己的编码,就不可避免会有冲突,这就阻碍了不同国家和地区直接的信息交流。
为了解决国际间信息传输和交流的障碍,国际标准化组织又搞出了一套Unicode编码,目标是把所有语言都统一到一套编码里,这样不同语言之间就不会产生乱码问题了。
在Unicode编码中,一般是用两个字节表示一个字符(特别偏僻的字符需要4个字节),目前现代操作系统和大多数编程语言都直接支持Unicode编码。但Unicode编码比ASCII编码多占用了近一倍的存储空间,所以在存储和传输上需要消耗较多的资源。
2.5 UTF-8编码
因为Unicode编码需要占用较多的存储空间,所以基于节约的原则,后来又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。目前UTF-8编码,已经是软件开发时的主流编码了。所以作为一个程序员,如果你们公司没有特别地说明,请各位把自己各种开发工具的编码都默认设置成UTF-8编码!
UTF-8编码是把一个Unicode字符,根据不同的数字大小编码成1-6个字节。通俗地说,UTF-8可以根据不同的符号自动选择编码的长短。 比如把常用的英文字母编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。所以如果我们的程序和信息中要传输大量的英文字符,用UTF-8编码就比较节省空间了。而且UTF-8 编码的另一个好处是容错能力强,如果传输过程中某些字符出错,不会影响后续字符。 因为UTF-8编码依靠高字节位来确定一个字符究竟是几个字节,所以现在它经常用来作为传输编码。
2.6 GBK编码
虽然之前已经有GB2312编码用于处理简体中文了,但因为GB2312编码设计的时间较早