JAVA乱码问题分析

来源:互联网 发布:黎明杀机淘宝多少钱 编辑:程序博客网 时间:2024/04/30 14:08

首先,所有的字符在计算机上都是以二进制存储的;

1.JAVA虚拟机JVM中的编码方式:

JAVA虚拟机JVMJAVA源代码编译成Unicode形式的byte code,其它数据在JAVA中也是以UNICODE形式存储的。

2. 汉字主要编码集的兼容关系:

   汉字的主要字符集有:GB2312,GBK, GB18030, UNICODE, UTF-8, BIG5;

   其中GBK兼容GB2312UNICODEUTF-8相对兼容(即可用一些公式进行转换,而无须知道两种字符表的一一映身关系)

GBK,GB2312,BIG5都为双字节编码,即所有的字符在该字符集内都占两个字节;

   GB18030采用单字节,双字节,四字节的存储方式,其中128ASCII符号为单字节区,所有汉字为双字节区;

UTF-8为一到六字节,其中汉字为两到三字节;

UNICODE为两字节,而扩展UNICODE集也有四字节字符,对于汉字及常用各种符号来说,都为双字节;

BIG5为台湾公司字符集,大陆不用;

故对于汉字存储体系来说,严格双字节或小于等于双字节的可以采用GB2312,GBK,GB18030UNICODE编码;

如果英文较多,为传输方便,则采用UTF-8,但这样就不好计算存储汉字所需空间;

 

3.JAVA读取文件并显示

1JAVA如何读取文件编码方式:

   在操作系统中,因为计算机本身无法知道当前文件的编码方式,故对于流文件,一般读取时要手动的指定其编码方式,否则JAVA会采用系统默认的字符映射表读取文件;对于WINDOWS来说,其默认字符集一般为GB系列;对于UNIXLINUX来说,一般为UTF-8;

2JAVA如何显示字符

  对于System.out.println()命令来说,JAVA默认采用当前系统默认的字符集来输出字符,如果在MYECLIPSEECLIPSE环境,JAVA则会采用当前工程默认的字符集来输出字符;

  3)总结2,3的字符转换就是:文件(由当前系统编码转为UNICODE->JAVA内存(由UNICODE编码转为当前显示系统的字符集)->当前显示系统的默认字符集

  所有的转换都是自动进行的,故实际上对我们并无影响;

但如果在转换的过程中,文件存储的编码格式并非系统默认的编码格式,则JAVA转换就会出问题,会出现乱码;

如果显示系统的字符集与文件采用的字符集不同,则有可能显示系统的字符集有可能未包含文件字符集的全部字符,如果显示这些字符时就会有?号;

4.WEB编码

  标准的WEB通信模式如下:

   客户机发消息->传输->服务器接收并返回消息->传输->客户机接收并显示

(1)       客户机发消息:

在这一步客户机的消息编码为本地编码(准确地说是该通信进程所采用的编码)

(2)       传输

首先:基本上所有的传输都采用ISO-8859-1标准传输,该编码兼容所有其它的编码方式;

其次:为减少传输时间,有些网站会对数据进行压缩,通常是GZIP格式;

(3)       客户机接收并显示

客户机接收该编码,并进行解码;对于JAVA来说,通常所有的通信类,包括Socket,URLConnection类,以及其它基于这两个类的继承类,在接收数据的时候会根据报文头的编码格式自动将对应的编码转为UNICODE编码;

但对于GZIP格式来说,浏览器外,JAVA中的类一般并不会自动进行解压缩,此时会出现乱码,故需要手动判断,如果报文头为显示Content-Encoding: gzip则必须调用GZIPInputStream对输入流进行解压缩操作;

4 对于WEB通信产生的乱码问题,可根据以上情况进行分析,但以上情况并不全面,

因此,最根本的方法是:首先确定是否服务器端即为乱码,如果不是,则对报文头进行分析,看是否报文解析问题,接下来才是本地的显示及编码问题;

5.数据库编码

     数据库也会自动将输入的字符串自动转为数据库的存储格式(此过程发生在JDBC过程中,还是数据库的底层驱动函数中暂不清楚),但须注意:

    1.CONNECTION中必须指定对应的数据库(确切的说是执行插入或更新操作的表的)字符编码格式;

    2.遇到数据库本地字符集无法存储的字符会抛错;

声明:

所有的分析的根据来源于网络及个人试验,因个人水平原因,本文可能存在错误,故该文章仅作参考,不作为可靠的技术文档;

 

 

原创粉丝点击