字符编码:
什么是字符编码:
如同之前所说的,计算机中都是以二进制的方式保存数据的
每个字节是由8个二进制数据组成的,因此每个字节可以表示的数字范围为0~255
每个字符是由2个字节组成的(也可能是多个,下面会讲到),因此每个字符可以表示的数字范围就大的多
而所谓字符编码,简单理解的话,指的就是将一个字符表示的数字,按照一定的编码规则来转化为文字
因此,字符编码实际上就是将数字如何转化成文字的规则
在中国大陆的本地化字符编码通常为GB2312和GBK
Unicode编码:
Unicode编码是由ISO(国际标准化组织)发布的,将全世界上所有符号和文字进行的统一的编码
如果全世界所有本地化编码都为Unicode编码,那么任何一个字符在全世界范围内代表的符号或文字都是一样的
Unicode编码中,每个字符都固定占有两个字节的大小,对于原本ASCII码的数据来说,Unicode也向前面统一加了一个数字为0的字节
Unicode编码的范围是0~65535,所有的符号对应的数字都不可以超过这个编码的范围
UTF-8编码:
UTF-8编码中,原本ASCII码的数据仍然只占有1个字节,而对于其他国家的符号和文字对应的数据,则分别占用2~3个字节不等
UTF-8编码的文件中,通常使用EF BB BF作为文件开头的3个字节数据
UTF-8编码的优势:
1、由于在UTF-8编码中,每个字符的开始位置的字节有着严格的规则的,因此应用程序可以很方便地检测在数据传输过程中是否发生了错误
2、由于在UTF-8编码中,每个英文字符只占用1个字节,因此可以大大减少需要传输的数据量
3、UTF-8编码完全兼容ASCII码
UTF-8编码的缺点:
由于UTF-8编码对中、日、韩文的编码通常使用3个字节来表示,因此可能会增加需要传输的数据量
*由于UTF-8的优点远远大于缺点,因此UTF-8编码为当今文档编写以及网络传输时最常使用的编码方式
*UTF-8的校验原理:
单字节:该字节必须以0开头,即字符的格式必须为0xxxxxxx
双字节:第一个字节必须以110开头,第二个字节必须以10开头,即字符的格式必须为110xxxxx 10xxxxxx
三字节:第一个字节必须以110开头,后两个字节必须均以10开头,即字符的格式必须为110xxxxx 10xxxxxx 10xxxxxx
UTF-16编码:
UTF-16编码中增加了Unicode没有包括的那些字符的表示方式(例如中国少数民族的语言及阿拉伯语等)
UTF-16编码完全兼容Unicode编码和UTF-8编码
UTF-16编码中,比起Unicode所扩充的那些字符,均占用4个字节
UTF-16编码文件中,通常使用文件头来表示该文件中字符的存储方式,0xFE 0xFF表示Big Endian,0xFF 0xFE表示Little Endian
*Intel内核存储多字节数据时,是低位字节保存在前,高位字节保存在后,称之为Little Endian
其他内核存储多字节数据时,通常是高位字节保存在前,低位字节保存在后,称之为Big Endian
字符编码的操作:
查看中文字符的GB2312码、UTF-8码和Unicode码
使用UltraEdit新建一个文本文档,选择字符编码格式,然后输入中文字符,最后按下Ctrl+H,即可以查看中文字符对应的编码
*打开未指定字符编码的文件时文件选择的默认编码:
首先系统会检测文件中的所有字符,看是否符合UTF-8编码的格式,若符合,则以UTF-8编码格式来显示,否则以本地编码来显示
打印中文字符的Unidcode码
int code = (int)chineseStr.charAt(index);
String unicode = Integer.toHexString(code);
打印中文字符的GB2312码
byte [] chineseBuf = chineseStr.getBytes("GB2312"); //将该字符串按照指定的编码来进行编码,JDK中必须支持该字符编码
String gb2312 = Integer.toHexString(chineseBuf[index]);
*在调用System.out.write()方法向缓冲区存入一个字节时,系统不会将缓冲区中的数据提交
在调用System.out.println()方法时,系统会自动调用flush方法将缓冲区中的数据提交到屏幕上
*如何取得当前JAVA虚拟机的默认字符编码信息
调用System.getProperties.list(System.out);可以将当前JAVA虚拟机的环境变量全部输出到屏幕上
在虚拟机的环境变量中找到file.encoding属性所对应的值,就是当前JAVA虚拟机的默认字符编码
如果想要修改该环境变量,则直接调用System.setProperty("fild.encoding","ISO8859-1");即可