文件编码与中文乱码问题

在进行文件读写I/O的是 , 经常遇到一些类似 , 编码出错的情况,很是烦人 。为什么会乱码 , 就要从编码说起 。

1、编码之间的关系


文件编码与中文乱码问题

编码关系
图中编码出现的顺序,可以看出编码也是一个逐渐进化与完善的过程;图中从上往下,下面的编码总是能兼容上面的编码;

2、常用编码

2.1、ASCII编码

【文件编码与中文乱码问题】ASCII全称为 American Standard Code for Information Interchange,翻译为“美国信息交换标准代码” 。它是世界上最早最通用的单字节编码系统,主要用来显示现代英语及其他西欧语言,不能表示中文成千上万个的单词 。ASCII编码,8bit(一个字节) , 能表示的最大的整数就是255(2^8-1=255),由于ASCII 的编码最高位总是 0 , 所以只定义了128 个字符,用0 - 127用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65 , 小写字母z的编码是122 。还对一些如'n','t','#','@'等字符进行了编码 。

2.2、ISO8859-1编码

ISO-8859-1又称 Latin-1,是一个 8 位单字节字符集,它把 ASCII 的最高位也利用起来 , 并兼容了 ASCII,新增的空间是 128 , 但它并没有完全用完 。在 ASCII 编码之上又增加了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号,它是向下兼容 ASCII 编码 。

2.3、汉字编码

汉字编码是由我国发布 , 从GB2312到GBK,再到GB18030,汉字由少到多,不断补全 。GBK全称为 Chinese Internal Code Specification , 即汉字内码扩展规范,于 1995 年制定 。它主要是扩展了 GB2312,在它的基础上又加了更多的汉字,它一共收录了 21003 个汉字,使用相对较多 。

2.4、Unicode

通常16bit(2个字节) , 为了统一所有文字的编码,Unicode应运而生 , 这是一种所有符号的编码,所有的字符都用 16 位(2^16=65536)表示会导致空间的浪费,UNICODE 在很长的一段时间内都没有得到推广应用 。Unicode 完全重新设计 , 不兼容 iso8859-1,也不兼容任何其他编码 。互联网的诞生,需要传输的数据非常多,如果都是用Unicode编码传输会造成很大的浪费 。UTF-8,UTF-16,UTF-32就诞生 。而且最广泛的就是常用的UTF-8 。

2.5、UTF-8

UTF-8 , Unicode Transformation Format,可变长度编码,通常使用1~4字节为每个字符编码,兼容ASCII编码,这是一种Unicode的一种转换格式 。其中 , 英文字母都是用一个字节表示,而汉字使用三个字节 。
在内存中通常以Unicode来储存 , 保存到文件中就替换为UTF-8等格式,可以压缩空间 。从文件中读取的时候,会有个转换编码 。就是常用的UTF-8等编码 。反之也是 , 从内存中保存到文件中,就转换为UTF-8等格式 。

3、java中编码与字符的关系

java是双字节编码,是utf-16be编码 , 但是eclipse、idea等可以设置默认编码方式 。当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式 , 否则会出现乱码 。
String s="一只青羊";
byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是项目默认的编码
for(byte b: bytes1)
System.out.println(Integer.toHexString(b & 0xff) " ");// & 0xff是为了把前面的24个0去掉只留下后八位
//toHexString这个函数是把字节(转换成了Int)以16进制的方式显示


String str1=new String(bytes4);//这时会使用项目默认的编码来转换 , 可能出现乱码
要使用字节序列的编码来进行转换
String str2=new String(bytes4,"utf-16be");
byte[] bytes1=s.getBytes("gbk");//也可以用指定的编码

4、中文乱码问题

文本文件就是字节序列,可以是任意编码的字节序列 , 如果我们在中文机器上直接创建文本文件,那么该文件只认识ANSI编码(例如直接在电脑中创建文本文件) 。Windows 操作系统默认的编码是 GBK , Linux 操作系统默认的编码是 UTF-8 。中文乱码问题只要注意指定编码方式即可规避 。

相关经验推荐