JAVA乱码问题分析

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

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. 遇到数据库本地字符集无法存储的字符会抛错;

声明:

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值