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

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

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

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

getBytes()

 byte[] java.lang.String.getBytes(String charsetName) throws UnsupportedEncodingException

 Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array. 

 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)来解码为字符串。下面是测试:

  @Test
public void getEncod() throws UnsupportedEncodingException {
String sysencod = System.getProperty("file.encoding");
System.out.println("系统默认编码:"+sysencod);
String str = "中文";
System.out.println("字符实例:"+str);
System.out.println("===============getbytes无参:===============");
byte[] bytes = str.getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i]);
}
System.out.println();
System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes));
System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes,"utf-8"));
System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes,"gbk"));
System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes,"iso-8859-1")); System.out.println("===============getbytes(utf-8):===============");
byte[] bytes2 = str.getBytes("utf-8");
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i]);
}
System.out.println();
System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes2));
System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes2,"utf-8"));
System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes2,"gbk"));
System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes2,"iso-8859-1"));
System.out.println("===============getbytes(gbk):===============");
byte[] bytes3 = str.getBytes("gbk");
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i]);
}
System.out.println();
System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes3));
System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes3,"utf-8"));
System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes3,"gbk"));
System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes3,"iso-8859-1"));
System.out.println("===============getbytes(iso-8859-1):===============");
byte[] bytes4 = str.getBytes("iso-8859-1");
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i]);
}
System.out.println();
System.out.println("通过默认字符集,将字符数组解码为字符:"+new String(bytes4));
System.out.println("通过utf-8字符集,将字符数组解码为字符:"+new String(bytes4,"utf-8"));
System.out.println("通过gbk字符集,将字符数组解码为字符:"+new String(bytes4,"gbk"));
System.out.println("通过iso-8859-1字符集,将字符数组解码为字符:"+new String(bytes4,"iso-8859-1"));
}

结果:

奇诡的是,虽然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的字符集:

java字符编码和oracle乱码的更多相关文章

  1. Java 字符编码归纳总结

    String newStr = new String(oldStr.getBytes(), "UTF-8");       java中的String类是按照unicode进行编码的 ...

  2. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  3. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  4. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  5. Java 字符编码(一)Unicode 字符编码

    Java 字符编码(一)Unicode 字符编码 Unicode(http://www.unicode.org/versions/#TUS_Latest_Version) 是一个编码方案,说白了希望给 ...

  6. java字符编码详解

    引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国 ...

  7. JAVA字符编码三:Java应用中的编码问题

    第三篇:JAVA字符编码系列三:Java应用中的编码问题 这部分采用重用机制,引用一篇文章来完整本部分目标. 来源:  Eceel东西在线 问题研究--字符集编码  地址:http://china.e ...

  8. JAVA字符编码二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换   1.函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有 ...

  9. JAVA字符编码一:Unicode,GBK,GB2312,UTF-8概念基础

    第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 来源:holen'blog   对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16, ...

随机推荐

  1. Perst常用命令

    Perst我使用的版本是4, 几乎支持所有的.net环境, 而且效率很高,比较稳定. 使用方法: 1:引用相应dll 2: 创建数据结构 public class Cp_struct : Persis ...

  2. STC12C5A60S2笔记4(复位)

    1. 基本特性 STC 单片机有5种复位方式: 1) 热启动复位: 1.1)外部RST引脚复位 第一功能复位脚,即管脚9 RST/P4.7,该管脚拉高维持24个时钟周期+10ms后,单片机进入复位状态 ...

  3. clearTimeout消除闪动

    需求:当鼠标放到父级菜单上面的时候,显示下方的子菜单.鼠标从子菜单或者父级菜单上面移开的时候,子菜单要收起来.最终效果如下: PS:这样需求很常见,最常见的做法是li元素下面再嵌套一个Ul元素来包含子 ...

  4. Java提高篇(二六)-----hashCode

          在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最 ...

  5. js中各种跨域问题实战小结(二)

    这里接上篇:js中各种跨域问题实战小结(一) 后面继续学习的过程中,对上面第一篇有稍作休整.下面继续第二部分: -->5.利用iframe和location.hash -->6.windo ...

  6. java source not found

    今天的挑战是,为什么与源码明明放在本机,调试的时候却说source not found呢? 这个是因为,我重新建立了debug,然后没有选择对应的项目. 另外一个问题是,如果给底层的jar附上源码呢?

  7. PSR规范

    背景 Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年.FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和 ...

  8. 关于STM32的外部引脚中断的问题

    今天想用自己以前的比较干净的工程模板做一个东西,,,,,,,在添加上引脚中断的时候,,突然想知道自己配置的中断优先级是否正确执行,,,,, 以前刚学习32的时候测试过是可以的,,不过今天发现了一个大问 ...

  9. Redis 监控

    redis 监控有 redis-live 和 redis-stat Redis-Live是一个用来监控redis实例,分析查询语句并且有web界面的监控工具,使用python编写. redis-sta ...

  10. fir.im Weekly - 94 个 iOS 开发资源推荐

    距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...