Java乱码解析
- 格式:doc
- 大小:122.00 KB
- 文档页数:9
Java 乱码解析(一)-J2SE一、字符集和编码⏹ 字符集:字符的集合。
常用的字符集有英文字符集、英文+中文简体字符集、英文+中文繁体字符集等。
⏹ 编码方案:字符在计算机中的字节表示。
每一种编码方案包含一种特定的字符集,字符集中的每一个字符,对应不同的字节表示。
常用的编码方案有ISO-8859-1,GB2312,GBK ,Big5,UTF-8,UTF-16(Unicode)。
编码方案通常被简称为编码、或者字符集编码。
图:编码规范,字符,字节对照图说明:1、 字符在计算机当中都是以字节存储的。
2、 不同的字符在不同的编码方案中所对应的字节可能不同。
3、 ISO-8859-1,一个字节表示一个字符, GB2312,GBK ,Big5, UTF-8是可变长编码方案,UTF-16四个字节表示一个字符。
4、 编码方案中将字符集中不包含的字符用63表示。
二、编码过程1、编译时编码Java 编译时,Java 文件->class 文件。
Java 编译时可以指定编译编码。
例如javac -encoding GBK xxx.java ,没有指定则默认使用操作系统编码。
中文版windows 的系统编码是GBK,linux 或者unix 一般是ISO-8859-1。
所以在中文版windows 操作系统上编译,javac -encoding GBK xxx.java = javac xxx.java字符 ISO-8859 -1 GB2312 GBK Big5 UTF-8 UTF-16 A 65 65 65 65 65 -2,-1,0,65 ? 63 63 636363 -2,-1,0,63 中63-42,-48-42,-48 -92,-92-28,-72,-83-2,-1,78,45楘(mu ) 63 63 -105,-6 -35,-26 -26,-91,-104 -2,-1,105,88在linux或者unix操作系统上编译,javac -encoding ISO-8859-1 xxx.java = javac xxx.javaJava编译过程:⏹Java编译器读取java文件中的字节,将这个字节按照javac命令中指定的编码方案中字符与字节的对应关系,转化成字符。
⏹java编译器将这些字符按照UTF-16编码方案中字符与字节的对应关系,转化成字节。
⏹将字节输出到class文件。
2、运行时编码Java运行过程:⏹Jvm将class文件按字节读入内存。
⏹执行main方法。
Java运行时也可以指定编码。
java -Dfile.encoding=GBK xxx,没有指定则默认使用操作系统编码。
这个编码的作用是输出数据时,将UTF-16的字节转化为字符,然后用java 命令中指定的编码中的字符与字节的对应关系,将字符转化为字节输出。
这里的输出包括控制台输出,文件输出,网络输出。
在中文版windows操作系统上编译,java -Dfile.encoding=GBK xxx = java xxx在linux或者unix操作系统上编译,java -Dfile.encoding=ISO-8859-1 xxx = java xxx 3、展现时编码字符的正确展现与展现软件的编码方案有关。
展现软件的编码方案一般与操作系统的编码方案一致。
展现软件包括,命令行窗口,文件。
在中文版windows操作系统上编译,java -Dfile.encoding=GBK xxx = java xxx在linux或者unix操作系统上编译,java -Dfile.encoding=ISO-8859-1 xxx = java xxx字符展现过程:将字节按照展现软件的编码方案中字符与字节的对应关系,转化为字符。
三、乱码的原因1、字符->字节,使用了错误的编码方案同一个字符,不同的编码方案,不同的字节。
2、字节->字符,使用了错误的编码方案同一组字节,不同的编码方案,不同字符。
注:以上情形,可能共存。
四、案例分析案例1中文版windows 操作系统,记事本输入“联通”,保存后关闭,然后重新用记事本打开乱码。
字符 ISO- 8859 -1 GB2312 GBK Big5 UTF-8 UTF-16 A 65 65 65 65 65 -2,-1,0,65 ? 63 63 636363 -2,-1,0,63 中63-42,-48 -42,-48 -92,-92 -28,-72,-83 -2,-1,78,45楘(mu )63 63-105,-6 -35,-26-26,-91,-104-2,-1,105,88字节 ISO- 8859 -1GB2312 GBK Big5 UTF-8 UTF-16 -63,-86,-51,-88 ???¨ 联通 联通 薊籵 j? ?? -46,-58,-74,-81 ????移动移动痄雄?????原因分析:记事本打开时猜测文件字符集,并且猜错了。
因为联通GBK编码后的字节符合UTF-8编码规范,所以记事本将联通编码后字节展现为了utf-8编码方案中字符与字节对应关系中的字符了。
解决方案:1、“联通”两个字前后加些其他中文字符。
2、使用其他软件查看,并设置GBK或者ANSI编码。
案例2中文版windows操作系统,下不指定编码集编译以下代码,形成Test.class 文件。
在字符集是ISO-8859-1的linux上不指定编码执行乱码。
原因分析:“中文”的UTF-16编码后的字节,在输出时被转化为ISO-8859-1编码方案中的字符。
ISO-8859-1无“中文”两个字,所以产生乱码。
解决方案:改变linux系统编码为支持中文的编码。
案例3中文版windows操作系统,下不指定编码集编译以下代码,形成Test.class 文件。
在字符集是en_US.UTF-8的linux上不指定编码执行形成文件,然后下载到中文版windows操作系统用写字板打开乱码。
原因分析:输出文件时,没有指定编码,所以“中文”被编码成UTF-8编码字符与字节对应的字节,写入文件。
中文版windows操作系统的写字板默认使用GBK编码,打开文件时,将文件中的字节,按照GBK字符与字节的对应关系,展示字符。
解决方案:1、用记事本打开,或者用其他可以选择编码的工具,指定为UTF-8编码后打开。
2、执行class文件时,指定编码。
java -Dfile.encoding=GBK xxx = java xxx案例4中文版windows操作系统,mysql,UTF-8编码数据库,jdbc查询出来的数据乱码。
原因分析:1、数据库本身乱码。
2、数据库的编码方案与操作系统的编码方案不同3、以上两点都有。
如果,数据库的字符以字节存储,查询时,数据库中的字节被java程序以运行时编码转化为字符。
数据库的编码方案与操作系统的编码方案不同,可能会造成乱码。
注:有些jdbc可以猜测字符集,所以即使数据库的编码方案与操作系统的编码方案不同,也由可能不出现乱码。
解决方案:1、改变数据库的字符集。
2、改变java运行时的字符集。
3、数据库连接url中指定数据库使用的编码方案。
Java乱码解析(二)-Java Web一、URL编码与字符集编码1、URL编码就是将非英文字符或者特殊字符转化为字节的十六进制表示。
URL编码表:字符ISO-8859-1GB2312GBK Big5UTF-8UTF-16A A A A A A AURL 编码,字符转化为字符3F=0011,1111(原码)=0011,1111(反码)=0011,1111(补码)=63 97=1001,0111(原码)=1110,1000(反码)=1110,1001(补码)=-105 FE=1111,1110(原码)=1000,0001(反码)=1000,0010(补码)=-22、字符集编码,就是将字符按照指定的编码方案,转化为字节。
字符->字节。
字符集编码表:二、Java Web 工作过程1、浏览器请求服务器即浏览器发送数据给服务器。
首先浏览器将发送的字符,按照特定URL 编码方案进行URL 编码,然后按照ISO8859-1编码方案将字符转化为字节;然后浏览器将字节数据发送给服务器。
2、服务器解析数据首先服务器(即web 容器),按照特定编码方案将收到的字节转化为字符;然后服务器将字符按照UTF-16编码方案转化为字节交给处理程序处理。
3、服务器响应浏览器即服务器返回数据给浏览器。
首先服务器将处理请求得到的字符,按照特定编码方案转化为字节;然后服务器字节,发送给浏览器。
? %3F %3F %3F %3F %3F %FE%FF%00%3F中%3F%D6%D0 %D6%D0 %A4%A4 %E4%B8%AD %FE%FF%4E%2D楘(mu ) %3F %3F %97%FA %DD%E6 %E6%A5%98 %FE%FF%69%58 字符 ISO- 8859 -1 GB2312 GBK Big5 UTF-8 UTF-16 A 65 65 65 65 65 -2,-1,0,65 ? 63 63 636363 -2,-1,0,63 中63-42,-48 -42,-48 -92,-92 -28,-72,-83 -2,-1,78,45楘(mu )63 63-105,-6 -35,-26-26,-91,-104-2,-1,105,884、浏览器解析数据首先浏览器,按照特定编码方案将收到的字节转化为字符;然后浏览器展现这个字符。
三、乱码的原因1、浏览器请求服务器时,使用了错误的URL编码方案。
2、服务器解析数据时,使用了错误的URL编码方案。
3、服务器响应浏览器,使用了错误的编码方案。
4、浏览器解析数据时,使用了错误的编码方案。
说明:1、不同的浏览器发送请求时,使用的编码方案可能不同。
(常见的浏览器有ie,firefox,opera,chrome)2、不同的web容器解析数据时,使用的编码方案可能不同。
(常见的web容器有tomcat,jboss,weblogic,webphere)3、浏览器解析数据时,可以指定编码方案。
4、Java web容器是运行在jvm上,与J2se程序一样,内部使用UTF-16编码方案。
5、浏览器主要有两种请求方式,Get,Post四、Get与Post方式说明1、同一个浏览器对Get和Post方式,采用相同的URL编码方案。
2、对于Post方式提交的数据,程序可以使用request.setCharacterEncoding(encoding)方法指定编码方案,不指定则使用web容器的编码方案;Get方式提交的数据,程序使用request.setCharacterEncoding(encoding)方法指定编码方案无效,只能使用web容器的编码方案。