java字符编码和oracle乱码

简介: 编码问题我仍旧没搞懂,最根本的从哪里来就没搞懂。当页面发送请求,编码到后台是什么编码呢?好吧,我默认的都是utf-8.后台接收参数后,可以在控制台打印出来,我也不清楚是什么编码。然后,就是数据库问题。 在mysql数据库,首先会设置mysql安装的字符集为utf-8,然后在连接的jdbc上注明characterEncoding是utf-8.一直这样统一下去,没有出现乱码。

编码问题我仍旧没搞懂,最根本的从哪里来就没搞懂。当页面发送请求,编码到后台是什么编码呢?好吧,我默认的都是utf-8.后台接收参数后,可以在控制台打印出来,我也不清楚是什么编码。然后,就是数据库问题。

在mysql数据库,首先会设置mysql安装的字符集为utf-8,然后在连接的jdbc上注明characterEncoding是utf-8.一直这样统一下去,没有出现乱码。

连接oracle就出现问题了,我使用的一个已经安装好的oracle数据库。字符集是American,us7ascii.我插入和查询的中文都是乱码。百度了很久之后,还是进行转码工作。

关于java编码,先看String中的几个方法:

getBytes()

1 byte[] java.lang.String.getBytes(String charsetName) throws UnsupportedEncodingException
2 
3 
4 Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array. 
5 
6 The behavior of this method when this string cannot be encoded in the given charset is unspecified. The java.nio.charset.CharsetEncoder class should be used when more control over the encoding process is required.

这里先要搞清楚编码(encode)和解码(decode).下面是个人推测,没有考证的解释:

encode:编码,将字符依据某种规则(字符集)解释为一串数字
decode:解码,将一串数字依据某种规则翻译为字符

理解了编码和解码后,从一个字符串开始解析。

字符串str="中文",str是一串字符,通过str.getBytes()可以编码成byte数组。通过new String(bytes)来解码为字符串。下面是测试:

 1  @Test
 2     public void getEncod() throws UnsupportedEncodingException {
 3         String sysencod = System.getProperty("file.encoding");
 4         System.out.println("系统默认编码:"+sysencod);
 5         String str = "中文";
 6         System.out.println("字符实例:"+str);
 7         System.out.println("===============getbytes无参:===============");
 8         byte[] bytes = str.getBytes();
 9         for (int i = 0; i < bytes.length; i++) {
10             System.out.print(bytes[i]);
11         }
12         System.out.println();
13         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes));
14         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes,"utf-8"));
15         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes,"gbk"));
16         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes,"iso-8859-1"));
17 
18 
19         System.out.println("===============getbytes(utf-8):===============");
20         byte[] bytes2 = str.getBytes("utf-8");
21         for (int i = 0; i < bytes.length; i++) {
22             System.out.print(bytes[i]);
23         }
24         System.out.println();
25         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes2));
26         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes2,"utf-8"));
27         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes2,"gbk"));
28         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes2,"iso-8859-1"));
29         System.out.println("===============getbytes(gbk):===============");
30         byte[] bytes3 = str.getBytes("gbk");
31         for (int i = 0; i < bytes.length; i++) {
32             System.out.print(bytes[i]);
33         }
34         System.out.println();
35         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes3));
36         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes3,"utf-8"));
37         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes3,"gbk"));
38         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes3,"iso-8859-1"));
39         System.out.println("===============getbytes(iso-8859-1):===============");
40         byte[] bytes4 = str.getBytes("iso-8859-1");
41         for (int i = 0; i < bytes.length; i++) {
42             System.out.print(bytes[i]);
43         }
44         System.out.println();
45         System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes4));
46         System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes4,"utf-8"));
47         System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes4,"gbk"));
48         System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes4,"iso-8859-1"));
49     }
View Code

结果:

奇诡的是,虽然getBytes打印的byte数组内容看起来是一样的,但此编码结构却是不同的。并不是一串字符通过某种字符集编码,再解码就可以还原的。这要看该字符是属于何种编码。中文字符只有utf-8和gbk能够存储成功,别的编码会出现漏码像7位编码之类的。而我要解决的就是中文乱码问题。因此,中文编码是关于utf-8和gbk的。

对于存储于oracle的中文字符,采用iso-8859-1.因此,需要考虑的就是utf-8还是gbk转储为iso-8859-1.

经过测试,存储的时候:p=new String(p.getBytes("gbk"),"iso-8859-1");而getBytes("utf-8")失败。

查询结果的时候:result = new String(str.getBytes("ISO-8859-1"),"gbk")可以将oracle的中文正常显示。

附上我用oracle的字符集:





唯有不断学习方能改变! -- Ryan Miao
目录
相关文章
|
4月前
|
SQL Oracle 关系型数据库
java往oracle存clob类型的值时,字符长度过长怎么办?
java往oracle存clob类型的值时,字符长度过长怎么办?
70 1
|
6月前
|
Oracle Java 关系型数据库
JSP struts2工资管理系统myeclipse开发oracle数据库bs框架java编程网结构
JSP 工资管理系统是一套完善的struts2设计系统MVC结构,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Oracle10g,使用java语言开发,系统主要采用B/S模式开发。
47 1
|
6月前
|
Oracle Java 关系型数据库
JSP停车场车位管理系统myeclipse开发oracle数据库BS模式java编程网
JSP 停车场车位管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助servlet+bean+dao (mvc模式开发),系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Oracle 10g,使用java语言开发系统主要采用B/S模式开发。
38 0
|
7月前
|
Oracle 关系型数据库 Java
java处理oracle的Clob字段类型的坑和2种解决办法
java处理oracle的Clob字段类型的坑和2种解决办法
|
7月前
|
SQL Oracle 关系型数据库
java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能
java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能
|
11月前
|
SQL Oracle 关系型数据库
Java swing+MySQL/Oracle 实现的飞机票预定系统订票系统课程设计
Java swing+MySQL/Oracle 实现的飞机票预定系统订票系统课程设计
255 0
|
11月前
|
Oracle Java 关系型数据库
Java操作oracle数据库提示:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK,问题处理
Java操作oracle数据库提示:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK,问题处理
625 0
|
Oracle Java 关系型数据库
loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
133 0
|
SQL Oracle Java
Java java jdbc thin远程连接并操作Oracle数据库
Java java jdbc thin远程连接并操作Oracle数据库
120 0
|
安全 Oracle Java
Oracle中国Java软件工程师代码编写规范2022最新公开版
Oracle中国Java软件工程师代码编写规范2022最新公开版

推荐镜像

更多