java 各种乱码情况分析

做软件开发的同学不论是新手还是那些老鸟都经常会遇到各种各样的乱码问题,本文章就这些乱码问题做一个简单的分析,以帮助大家去理解、处理这些问题。下边分两种情况去分析这种问题。

一、每种软件的默认编码方式不同

1、记事本

记事本是大家常用的软件,也许你会经常听别人说记事本是无编码的,可是你明白记事本为什么是没有编码的吗?

其实是这样的,记事本确实是没有编码方式的,也就是说记事本你写进去什么内容它(记事本)就显示什么内容,这里需要注意的是你写入的内容就是显示的内容,根本原因是因为记事本没有默认的编码方式。

2、EXCEL

EXCEL有自己默认的编码方式(ASCII),注意这里要区分上边的记事本,正因为类似EXCEL这样的软件有默认编码,所以才会产生乱码问题。例如:你用程序往EXCEL中写入UTF-8格式的内容,而你默认打开该EXCEL时它会用ASCII的格式打开,这时用ASCII去读取UTF-8写入的内容就会出现乱码。

二、写入编码格式和读取编码格式不同

为什么要把【每种软件的默认编码方式不同】写在第一条呢,其实这样是想让大家理解不同软件的默认编码方式不同(觉得自己说的这些有点啰嗦),这里要引入的是浏览器,浏览器也是一种软件,也有自己的默认编码方式。下边再分两种情况去介绍。

1、页面访问乱码

如果服务器传回的页面(文件)有编码方式(例如:UTF-8),而页面中这时又没有指定文件内容的编码方式,这时浏览器就会按照自己的默认编码方式(例如:GBK)去读这个UTF-8文件,这时就会产生乱码情况。解决方式就是在该页面文件中指定编码方式。

2、文件下载时名称乱码

大家做文件下载时经常会遇到文件名称乱码的情况,项目中指定的全局的编码方式,页面中同样也指定了相同的编码方式,可是为什么还是会乱码呢,这是因为文件下载时会自动用浏览器的默认编码方式(GB系列)去读取你往浏览器传回的文件名称(往往是UTF-8),所以乱码就产生了,文件下载不同与页面,所以你指定页面的编码方式在这里是不起作用的,解决方式就是把文件名称用GB系列编码方式编码。

3、文件下载时内容乱码

这里举一个容易出错的例子,大家生成一个CSV文件传回到客户端(用流的方式)后,在客户端用EXCEL打开这个CSV文件,往往发现里边的内容是乱码的,这时不论你再后台程序中怎么调试,怎么设置编码它都是乱码的。乱码的根本原因就是EXCEL是有默认编码方式的(ASCII),这里要区分下,EXCELL可以自动识别编码方式,但识别有没有一个标准的类型,而我们的后台应用往往是UTF-8(无BOM(Byte Order Mark))(至于BOM不理解的大家问度娘吧),而EXCEL是用UTF-8(有BOM)方式去读取。解决方法就是往CSV中写入内容时就写入有BOM标识的UTF-8格式:

OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");
// 要输出的内容
result = (String)contentMap.get(RESPONSE_RESULT);
resp.setHeader("Content-Disposition", "attachment;filename=test.csv");
osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
osw.write(result);
osw.flush();

java 各种乱码情况分析

时间: 2024-12-12 21:50:36

java 各种乱码情况分析的相关文章

文《关于c++与java中文乱码问题分析与解决》中一个bug分析

文<关于c++与java中文乱码问题分析与解决>中一个bug分析 DionysosLai([email protected]) 2014/10/21 在前几篇一博客<关于c++与java中文乱码问题分析与解决>,地址如下:http://blog.csdn.net/dionysos_lai/article/details/38389765.文中详细介绍了c++与java数据传递时,为何会出现中文乱码的原因,并提出了适当的解决方法.方法如下: int CCDirector::GBKTo

关于c++与java中文乱码问题分析与解决

关于c++与java中文乱码问题分析与解决 DionysosLai([email protected])  2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码方式存在差异. 在java内部是使用16bit的unicode编码(即utf-16)来表示字符串,无论英文还是中文都是2字节. C/C++使用的是原始数据,ascii是一个字节,中文一般是GB2312编码,用2个字节表示一个汉字. Jni内部是使用utf-8编码表示字符串的,utf-8是扁长的unic

Java Web乱码分析及解决方案(一)——GET请求乱码

引言:     在进行Web开始时,乱码是我们最经常遇到也是最基本的问题,有经验的程序猿很容易能解决,初学者则容易被泥潭困住.而且很多时候,我们即使解决了乱码问题也是不明就里,往往云里雾里. 其实乱码问题很简单,就是客户端和服务器使用了不一样的字符集导致的.也就是我们发送文件是用的字符编码和解析文件的编码不一致.所以只要搞清楚了我们的文件是怎么被编码和解码的解决乱码就很简单了.分析乱码,我们从请求乱码和响应乱码来分析,请求乱码又需要根据GET和POST来单独分析. 请求乱码--GET     请

Java Web乱码分析及解决方案——POST请求

引言 GET请求的本质表现是将请求参数放在URL地址栏中,form表单的Method为GET的情况,参数会被浏览器默认编码,所以乱码处理方案是一样的.对于POST请求乱码,解决起来要比GET简单,我们关心的重点是在Request Body中. 请求乱码--Method方式 使用Method方式发送HTTP请求时,根据HTTP协议的规定,查询参数应该在Request的Body中,例如在Chrome下可以看到URL中不含有查询参数. 浏览器的编码 浏览器对POST的Request Body编码会采用

GDAL在java中乱码问题解决方案

[前序] 首先关于GDAL源码方面,GDAL开源项目源码是使用C++语言所写,通过源码的编译可以生成支持一系列语言如c++/java/php/csharp/perl/python/ruby开发所依赖的第三方包或头文件.GDAL的同时支持不同平台下的编译生成,在Win平台下使用起来出现的问题较多,比如编译时选择不同的编译选项32位或x64位产生出不同的依赖库,还有中文路径.中文读写问题等等. 在使用GDAL在java环境下进行读写数据文件时,遇到java语言读tab数据源出现乱码问题,具体的情况描

JAVA线程池的分析和使用

http://www.infoq.com/cn/articles/java-threadPool/ 1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 2. 线程池

Java语言特点及分析

Java语言特点及分析 Java是一门面向对象编程语言. (Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.) Java具有简单性.面向对象.分布性.健壮性.安全性.平台独立与可移植性.多线程.动态性等特点 .Java可以编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等. Java语言的这些特点体现了java的如下特性: 能够快速入门 编写的程序代码较少 编写较好的程序代码 更快速的开发程序 利用百分之百纯Java

java中文乱码解决之道(一)-----认识字符集

沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.com来解决问题.阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有一个清晰明了的认识,于是LZ想通过这系列博文(估计只有几篇)来彻底分析.解决java中文乱码问题,如有错误之处望各位同仁指出!当然,此系列博文并非LZ完全原创,都是在前辈基础上总结,归纳,如果雷同纯属借鉴-- 问

三个实例演示 Java Thread Dump 日志分析

jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注) 暂停,Suspended 对象等待中,Object.wait() 或 TIMED_WAITING 阻塞,Blocked(重点关注)   停止,Parked 下面我们先从第一个例子开始分析,然后再列出不同线程