乱码一直是一个很让人头疼的问题,这次往oracle的Blob里面写东西的时候,又出现了乱码。不过这次成功解决了,看了几篇讲java编码格式的文章恍然大悟,原理其实很简单,大家可以到这几个链接看看,他们写的很清楚:
http://lavasoft.blog.51cto.com/62575/273608
http://developer.51cto.com/art/200906/132635.htm
http://topic.csdn.net/u/20080822/11/69048375-6928-4a30-a58a-3ded53dc53f2.html
http://blog.csdn.net/fangao2620/archive/2008/02/25/2120221.aspx
http://jiangzhengjun.iteye.com/blog/512072
http://ayagen.iteye.com/blog/587653
其实,说白了就是,java中的String永远都是unicode编码的,以它作为中间结果转化成各种不同的编码格式,比如:
String str = "中文";
byte[] utf8b = str.getBytes("UTF-8");
byte[] gbkb = str.getBytes("GBK");
// 没有乱码
System.out.println(new String(utf8b, "UTF-8"));
// 没有乱码
System.out.println(new String(gbkb, "GBK"));
// 有乱码
System.out.println(new String(gbkb, "UTF-8"));
// 有乱码
System.out.println(new String(utf8b, "GBK"));
byte数组utf8b和gbkb是不一样的,是转化成各自编码格式后的二进制数组,而new String(utf8b, "UTF-8")与new String(gbkb, "GBK")是一样的都是以Unicode编码保存。
我们可以来分析一下:
1. 当执行以下时:
byte[] utf8b = str.getBytes("UTF-8");
jvm实际上是做了这样的转化 UNICODE => UTF-8,就是将Jvm内存中的unicode编码二进制码转化成UTF-8格式的二进制码然后赋值给byte[] utf8b
。这个转化的过程我们不用管,jvm会根据一个编码格式对照表来转化。
2. 当执行后面代码:
new String(utf8b, "UTF-8")
实际上第二个参数"UTF-8"告诉jvm:“当前utf8b的编码格式是"UTF-8",你就以这个格式转化成unicode吧!”。也就是将utf8b转化成unicode再存入Jvm的内存,utf8=>unicode。(这个参数应该是为了告诉jvm使用“UTF-8”的编码格式对照表来转化)
很多时候出现乱码实际上就是第二个过程出现了问题,比如有个页面是以“UTF-8”方式编码的,当你提交了一个表单后,浏览器将表单的内容以“UTF-8”格式编码后以HTTP POST请求的方式发送到后台。当HTTP Post请求到达servlet后,提交的表单数据都是“UTF-8”编码的二进制数据。当你调用request.getParameter("someParam")的时候,servlet实际上将inputstream中“someParam”的数据取出,然后将其转化成字符转。为了便于理解,我们假设这段数据是一个byte[] pb,当你调用了request.getParameter("someParam")时相当于调用了new String(pb),由于你没有指定使用何种方式编码,因此,jvm使用系统默认的编码格式编码,这时如果你的系统默认编码格式是“UTF-8”那就相当与调用了
new String(utf8b, "UTF-8")
不会出现乱码。但是如果你很倒霉,你的默认编码格式是“GBK”那么就好比调用了
new String(utf8b, "GBK")
乱码就不可避免了。因为,jvm会试图将原来是"UTF-8"格式的数据使用"GBK"的对照表来转化成unicode,结果当然是牛头不对马嘴了。
分享到:
相关推荐
### Java编码格式转换 在Java开发中,字符编码的转换是一项常见的需求,尤其是在处理国际化文本时。本文将详细介绍如何在不同的编码格式之间进行转换,并探讨一些常见的编码转换错误及其处理方法。 #### Unicode与...
【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...
在Java编程环境中,正确处理文件的真实格式和编码格式至关重要,特别是在进行数据解析和文本处理时。这个主题主要涉及两个核心工具类:`VerifyFileType.java` 和 `VerifyFileEncoder.java`,它们分别用于验证文件的...
总结来说,Java本身虽然没有直接提供文件编码检测功能,但结合第三方库如CPDetector和JChardet,我们可以编写程序来识别各种编码格式的文件。这在处理多语言环境、导入导出数据或跨平台项目时非常有用。这些工具可以...
文中部分节选 1.整型实例。 修复建议:使用Integer.valueOf()替代new Integer。 2.switch语句包含太少分支。 修复建议:分支比较少的时候建议使用if else。原因:switch用来处理多分支的情况。...
除了这些传统编码标准,文档还提到了Java中使用的编码格式,如UTF-8、UTF-16和UTF-32。UTF-8是一种可变长度的字符编码方式,它可以使用一个到四个字节表示一个字符,适合各种字符集,并被广泛使用于网络传输。UTF-16...
腾讯 Java 编码规范 腾讯 Java 编码规范是腾讯集团管理标准的一部分,旨在确保公司项目代码的易维护性和编码安全性。该规范涵盖了 Java 编码风格、文件组织、代码风格、注释、命名、声明、异常、习惯等方面。 一、...
Java编码是程序开发的核心环节,主要涉及Java语言的语法、编程规范、最佳实践以及相关工具的使用。在Java编程中,我们遵循一定的规则和标准,以确保代码的可读性、可维护性和高效性。以下是对Java编码相关知识点的...
在Java开发中,经常会遇到需要处理不同编码格式的文件的情况。为了确保程序能够正确解析文件内容,必须先判断文件的编码格式。本文将详细介绍如何使用Java来判断文件是否为UTF-8或GBK编码,并提供一个示例代码。 ##...
总结起来,获取网页编码格式是Web开发中的一个重要任务,尤其在处理多语言和国际化内容时。Java提供了丰富的库,如CharDet和CPDetector,可以帮助开发者有效地识别和处理各种编码问题。通过理解这些工具的工作原理和...
在Java中,`java.nio.charset.Charset`类用于表示字符编码,但默认情况下,Java文件读取操作通常假设文件为UTF-8编码。对于其他编码,我们需要借助第三方库如`jcconf`或`ICU4J`来检测编码。 ```java import ...
总结来说,Java编码规范是实现高质量Java代码的基础,涵盖了代码格式化、命名、排版、注释等多个方面。遵循这些规范,不仅有助于提升代码的可读性和可维护性,还能促进团队内部的协作效率,确保项目开发的标准化和...
### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...
本文将详细介绍如何在Java编码中创建注释以及如何使用apidoc工具自动生成文档。 首先,Java提供了多种注释类型,包括单行注释、多行注释和Javadoc注释。单行注释以`//`开始,适用于快速添加临时或简单的说明。多行...
以下是对Java中编码方式和Unicode的知识点总结: 1. 基本概念 - bit:计算机存储的最小单位,只能是0或者1。 - byte:一个字节是8个bit,计算机表示的基本单位。 - 字节换算:1KB(千字节)= 1024字节,1MB(兆字节...
总结而言,该JAVA安全编码规范参考文档为开发者在编写安全的Java代码时提供了一套全面的指导方针,从基本原则到具体漏洞的解决办法,都有详细说明。遵守这些安全编码规范,能有效减少系统漏洞,提高Java应用的安全性...
### Java编码规范详解 ...以上内容总结了Java编码规范的关键要点,涵盖了文件命名、组织结构、代码格式、命名规则以及编程实践等多个方面。遵循这些规范可以帮助开发团队编写出高质量、可维护的Java代码。