JAVA乱码问题分析
来源:互联网 发布:黎明杀机淘宝多少钱 编辑:程序博客网 时间:2024/04/30 14:08
首先,所有的字符在计算机上都是以二进制存储的;
1.JAVA虚拟机JVM中的编码方式:
JAVA虚拟机JVM把JAVA源代码编译成Unicode形式的byte code,其它数据在JAVA中也是以UNICODE形式存储的。
2. 汉字主要编码集的兼容关系:
汉字的主要字符集有:GB2312,GBK, GB18030, UNICODE, UTF-8, BIG5;
其中GBK兼容GB2312,UNICODE与UTF-8相对兼容(即可用一些公式进行转换,而无须知道两种字符表的一一映身关系)
GBK,GB2312,BIG5都为双字节编码,即所有的字符在该字符集内都占两个字节;
而GB18030采用单字节,双字节,四字节的存储方式,其中128个ASCII符号为单字节区,所有汉字为双字节区;
UTF-8为一到六字节,其中汉字为两到三字节;
UNICODE为两字节,而扩展UNICODE集也有四字节字符,对于汉字及常用各种符号来说,都为双字节;
BIG5为台湾公司字符集,大陆不用;
故对于汉字存储体系来说,严格双字节或小于等于双字节的可以采用GB2312,GBK,GB18030,UNICODE编码;
如果英文较多,为传输方便,则采用UTF-8,但这样就不好计算存储汉字所需空间;
3.JAVA读取文件并显示
(1)JAVA如何读取文件编码方式:
在操作系统中,因为计算机本身无法知道当前文件的编码方式,故对于流文件,一般读取时要手动的指定其编码方式,否则JAVA会采用系统默认的字符映射表读取文件;对于WINDOWS来说,其默认字符集一般为GB系列;对于UNIX或LINUX来说,一般为UTF-8;
(2)JAVA如何显示字符
对于System.out.println()命令来说,JAVA默认采用当前系统默认的字符集来输出字符,如果在MYECLIPSE或ECLIPSE环境,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.遇到数据库本地字符集无法存储的字符会抛错;
声明:
所有的分析的根据来源于网络及个人试验,因个人水平原因,本文可能存在错误,故该文章仅作参考,不作为可靠的技术文档;
- JAVA乱码问题分析
- JAVA乱码问题分析
- JAVA乱码问题分析参考文章
- Java中文乱码问题分析及解决办法
- Java GBK中文乱码问题分析
- Msql乱码问题分析
- 乱码问题分析(转)
- 乱码问题原理分析
- 中文乱码问题分析
- 中文乱码问题分析
- 分析Java中乱码问题产生的根
- 孙鑫谈Java中文乱码问题产生原因分析
- 关于c++与java中文乱码问题分析与解决
- Java Web中常见乱码问题的分析与解决
- 【中文乱码】深入分析 Java Web 中的中文编码问题
- java 乱码分析
- java乱码分析解决
- java 乱码原因分析
- html页面中的各种鼠标样式
- 设置OpenFileDialogd对话框的初始化目录为桌面
- 谈谈关于IE8的一些bug,主要是base href
- .net 3.5 sp1方法this.startEvent.WaitOne
- ORACLE 常用的SQL语法和数据对象
- JAVA乱码问题分析
- 数据库设计中的14个技巧
- JAVA乱码问题分析
- Oracle数据库设计开发阶段性能优化策略
- linux service 配置
- JAVA乱码问题分析参考文章
- mysql常见错误与标准错误对照表
- 怎样看懂Oracle的执行计划
- 莫名的伤感