常见的编码格式/txt文件乱码

常见的编码格式

 

比较常见的编码格式大体上可以分为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中的中文乱码问题。

 

注意,虽然说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")

你可能感兴趣的:(常见的编码格式/txt文件乱码)