常见的编码格式
比较常见的编码格式大体上可以分为ASCII编码和Unicode编码。
ASCII编码
ASCII编码:是出现最早的编码格式。属于单字节编码ASCII码使用7bit表示一个字符,共128个字符。是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。
ANSI编码:是在ASCII编码的基础上拓展的一中编码。将ASCII编码补全到8位。用8bit表示1个字符,共256个字符。所谓ansi编码,就是一种未经国际标准化(也没办法标准化,因为扩展部分的内码存在交集)的兼容ascii编码的,非unicode字符集编码。Win98 之前的系统都是采用这种编码格式。其中最常见的就是ISO8859-1编码。
ISO8859-1编码:通常叫做Latin-1,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,
仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。大家常用的软件,如:txt记事本,editplus等,就是采用的ANSI编码。我们平时所说的ANSI编码一般默认指的是ISO8859-1编码。所以,大家在用java 操作txt的时候,一定要记住,需要用ISO8859-1解码,不然,会出现中文乱码。
Unicode编码
ANSI编码编码出现后,各国在ANSI编码基础上,拓展出了各国的编码集,但由于ANSI字符集在不同语言环境下的不统一,导致字符集太多,国际交流中也需要进行字符集转换,带来很大不便。于是出现了unicode字符集。Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编
码的,也不兼容任何编码。该字符集使用16bit代表一个字符,可表示65536个字符。为了在网络上传输unicode字符,Unicode可以有多种编码方式,如UTF-16, UTF-8, UTF-32等。
UTF-8编码
考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。UTF-8编码的重要特性就是兼容iso8859-1编码。所以,java可以通过iso8859-1解码一些ANSI编码的中文文件,然后再以UTF-8编码格式编码,就可以解决java中的中文乱码问题。
GBK/GB2312
ANSI编码出现后,各国在ANSI编码基础上,拓展出了各国的编码集。中国也拓展出了中文编码。GBK/GB2312是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。 也就是说GBK/GB2312
编码是中国拓展的能够解析中文的ANSI编码。同样,因为GBK/GB2312兼容iso8859-1编码,java可以通过iso8859-1解码一些ANSI编码的中文文件,然后再以UTF-8编码格式编码,就可以解决java中的中文乱码问题。因为GBK/GB2312是在ANSI编码基础上拓展的,所以也可以用GBK/GB2312来解码ANSI编码的txt文件。
注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。
特别注意:java中对包含中文的txt文件的处理,一定要先用iso8859-1解码,然后再依据系统代码的编码格式,决定采用GBK还是UTF的编码格式对解码后的内容再编码。同时,http请求也以iso8859-1编码的方式编码请求。
例如:读取txt文件
line=new String(line.getBytes("ISO-8859-1"), "gb2312");
写入txt文件
resultFile.writeBytes(new String(getTitle().getBytes("GBK"), "iso-8859-1")
有时候,用这种方式读取的内容中文依然乱码,可以用
reader = new BufferedReader(new InputStreamReader(new FileInputStream(“”),"gbk"));
这样读取出来的内容就是gbk编码的了,中文不会乱码。