- 浏览: 241482 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
sweed0:
为何每一段代码都重复一次呢?
spring注解实例二 -
Gary_Huangpf:
- - 插件报错啊
Ext前台分页 -
ddvk2007:
版主 我想請問你所說的mapreduce是hadoop的還是g ...
MapReduce中的Shuffle和Sort分析 -
人可木:
好问章,楼主写的相当详细。。。多谢。。。
findbugs插件的安装与应用 -
hautbbs:
按照博主的方法启动调试出现jvm terminated.Ex ...
10分钟学会使用MyEclipse断点调试js
Java中乱码问题很常见,原因也多种多样,这里做一个总结,不求全面,力求准确,如果错误欢迎指正。 1.文件页面编码导致的乱码。 每一个文件(java,js,jsp,html等)都有其本身的编码格式,文件中的代码在一种编码中显示正常,在另外一种编码下就会显示出乱码。 有兴趣了解更多,可以参考如下链接的文章,写的很好。 http://www.cnblogs.com/xiaomia/archive/2010/11/28/1890072.html 2.不同字符集的字符串转换时导致的乱码。 输出结果为: 可以看出,使用GBK和UTF-8编码,得到的byte数组长度不一样,原因就是utf-8使用3个字节来编码中文,而GBK使用2个字节来编码中文。因为我的项目默认使用UTF-8,所以使用不加参数的getBytes()得到的数组长度和使用UTF-8编码的 字符串长度一样。关于字符集的详细知识可以参考第一部分中给出的文章地址。 JDK中关于getBytes方法的描述: getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。 每一个字符串底层都有自己的编码方式。不过一旦调用getByte方法后,得到的byte数组就是使用某种特定字符集编码后的数组,不需要再做多余的转换。 当得到上面的byte数组后,就可以调用String的另外一个方法来生成需要转码的String了。 输出结果为: 可以看出,使用哪种字符集编码一个String,在生成一个String的时候就必须使用相应的编码,否则就会出现乱码。 3.Socket网络传输时导致的中文乱码。 众所周知,Java中分为字节流和字符流,字符(char)是16bit的,字节(BYTE)是8bit的。PrintStrean是写入一串8bit的数据的。 PrintWriter是写入一串16bit的数据的。 可以这样理解上面的话,PrintStream是用来操作byte, PrintWriter是用来操作Unicode, PrintStream一次读8bit的话,如果遇到汉字(一个汉字占16bit),就可能会出现乱码。一般需要处理中文时用PrintWriter好了。 最后网站测试,使用PrintWriter没有出现乱码。代码如下: 需要注意的方面是,需要使用PrintWriter的println而不是write方法,否则服务器端会读不到数据的。原因就是println会在输出的时候在字符串后面加一个换行符,而write不会。 4.JSP中显示中文的乱码。 b.在HTML的head标签中添加如下语句。 c.保证JSP的页面编码与上面两个的charset相同,这点我有在文章的第一点说过。 上面的字符集可以根据需要自己灵活选择,不一定非要utf-8。不过因为utf-8对各国语言,特别是中文支持较好,所以推荐使用。我就曾经遇到过滘在GB2312编码的页面无法正常显示的问题。 如果是在jsp文件中,则可以使用如下语句进行转码。 需要转码的地方使用URLEncoder进行编码: 无论使用哪种方法,在后台获取中文的时候都要使用如下代码: 【注】 其中param为要传递的参数。 后台部分和get方法一样,设置如下即可,注意传输和接受的字符集要统一。 没懂的话可以参考如下文章,写的挺好。 6.后台向前台传递中文乱码。 7.下载文件时文件名乱码。 附上一段代码,用来帮你完成无乱码下载。 核心代码就上几句,注意第二句和第三句的reset的顺序不能搞错。 以上只是做了比较简单的总结,具体乱码有的时候可能是多个情况的组合,具体问题具体分析。如果错误欢迎指正。
在Eclipse中,每一个工程都会有编码格式(Text file encoding), 一般默认为GBK。而一个比较好的编程习惯是新建一个项目,优先把项目的编码设为UTF-8。
这样做的原因很简单,UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。几种常见的字符集,GBK,GB2312,UTF-8之间的关系如下:
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换
每一个String,底层实现都是用一个byte数组存储,使用不同的字符集,存储的数组长度当然就不同。如果不使用同一种字符集进行解码,就一定会出现乱码。
例如如下代码:
getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
测试例子如下:
简单来讲,只有满足如下公式的String转码,才不会乱码。
JDK中关于getBytes方法的描述:
String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
使用Socket进行通讯的时候,传输有多种选择,可以使用PrintStream,也可以使用PrintWriter。传输英文还好,传输中文就可能出现乱码问题。网上的说法很多,经过实际测试,发现问题还在字节和字符的问题上面。
String缺省是用UNICODE编码,是16bit的。因此用PrintWriter写入的字符串,跨平台性好一些,PrintStream的可能会出现字符集乱码。
Println和write具体区别可以参考如下网址,里面的网友有讨论:
http://www.oschina.net/question/101123_17855
有的时候JSP页面在显示中文的时候会有乱码,大多数情况就是字符集配置和页面编码的问题。只要保证如下的几个配置没有问题,一般就不会有乱码出现。
a.JSP页面顶端添加如下语句:
5.Post和Get传递中文,后台获取乱码。
前台传递中文也分为Get和Post方法。
a.Get方法的情况:
Get方法的时候主要是URL传递中文。
如果是在js文件中,可以使用如下代码进行中文转码。
页面开始引入:
1.对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,为了统一,需要提交指定传输编码。
2.上面代码的第二句好像和第2条中给出的公式矛盾。我也纠结了好久,最后发现ISO8859-1是一种比较老的编码,通常叫做Latin-1,属于单字节编码,正好和计算机最基础的表示单位一致,因此使用它进行转码一般也没有问题。
iso-8859-1是JAVA网络传输使用的标准字符集,而gb2312是标准中文字符集,当你作出提交表单等需要网络传输的操作的时候,就需要把 iso-8859-1转换为gb2312字符集显示,否则如果按浏览器的gb2312格式来解释iso-8859-1字符集的话,由于2者不兼容,所以会是乱码。为了省事,建议统一使用utf-8字符集。
b.POST方法的情况。
对于Post的情况就比较简单了,只需要在post的函数调用部分,制定post的header的字符集,如:
http://www.cnblogs.com/qiuyi21/articles/1089555.html
在这里提供一个函数,通过这个函数来发送信息,就不会出现乱码,核心思想也是设置response流的字符集。函数代码如下:
下过下载的人都知道下载的文件容易出现乱码,原因也是没有对输出流的编码格式进行限定。
reset的作用是用来清空buffer缓存的,清空请求前部的一些空白行。
发表评论
-
解析网页利器组合(正则、jsoup、beanshell、dozer)资源
2012-05-31 16:09 1422由于项目需要使用java正则、jsoup、dozer、bean ... -
Java正则表达式(二)
2012-05-31 15:47 829Matcher类: 使用Matcher类,最重要的 ... -
Java正则表达式(一)
2012-05-31 15:46 811正则表达式在处理文本方面用处非常大,最早像在Perl和awk语 ... -
Java正则表达式详解
2012-05-31 15:45 802如果你曾经用过Perl或 ... -
理解String与String.intern()
2012-01-05 15:44 8041. 首先String不 ... -
StringUtils工具类的常用方法
2011-11-25 15:24 905StringUtils 方法的操作对象是 java.lan ... -
主题:深入分析 Java 中的中文编码问题
2011-11-11 09:06 958几种常见的编码格式 ... -
java反射机制详解 及 Method.invoke解释
2011-08-26 11:40 1641JAVA反射机制是在运行状态中,对于任意一个类,都能够 ... -
java编程中'为了性能'一些尽量做到的地方
2011-08-25 11:42 839最近的机器内存又爆满了,出了新增机器内存外,还应该好好re ... -
利用java反射原理写了一个简单赋值和取值通用类
2011-08-22 09:50 2416由于项目的实际需要,所以利用java反射原理写了一个简单给be ... -
Java实现给图片添加水印
2011-08-22 09:41 2060周末在家上围脖,看到sina围脖上图片都有水印,想到Jav ... -
java获取当前类的绝对路径
2011-08-03 10:41 1154在jsp和class文件中调用的相对路径不同。在jsp里, ... -
深入浅出URL编码
2011-08-03 10:30 755深入浅出URL编码 版权声明:如有转载请求,请注明出 ... -
URLConnection的连接、超时、关闭用法总结
2011-08-03 10:25 1279Java中可以使用HttpURLConnection来 ... -
Apache Rewrite实现URL的跳转和域名跳转
2011-07-28 11:31 1061Rewirte主要的功能就是实现URL的跳转,它的正则表达式是 ... -
文件、流总结
2011-07-27 09:31 13771、File类:File类位于java ... -
java对cookie的操作(转)
2011-07-18 15:56 959java对cookie的操作比较简单,主要介绍下建立coo ... -
java泛型
2011-07-18 15:42 801在Java SE1.5中,增加了一个新的特性:泛型(日本语 ... -
j2ee学习笔记——初试ssh之泛型通用dao(转)
2011-07-18 15:39 879在做项目的时候每次都为每个POJO实体写一个对应的DAO很 ... -
urlRewrite重写技术的运用(转)
2011-07-18 15:24 1186如何增强你网站中地址的可读性和让搜索引擎快速的收录到你的站点, ...
相关推荐
java中文乱码问题java中文乱码问题java中文乱码问题
java中文乱码问题详解--- java中文乱码问题详
java中文乱码问题处理方案.docx
NULL 博文链接:https://doujun1998.iteye.com/blog/1758722
Java中文乱码问题研究
java中文乱码问题详解.pdf
JAVA 乱码问题,JAVA 乱码问题,JAVA 乱码问题JAVA 乱码问题JAVA 乱码问题JAVA 乱码问题
解决JAVA编程中遇到的各种乱码问题,对乱码问题的分析
jsp,java中文乱码问题另类解决方案,jni加密、解密编码
java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.com来解决问题。阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有...
文《关于c++与java中文乱码问题分析与解决》中一个bug分析DionysosLai(906391500@qq.com) 2014/10/21 在前几篇一博客
本资源用来解决java中文乱码问题,有很多解决java中文乱码的方法
在java中经常会遇到中文乱码问题,该问题很好的分析描述了该问题...............
主要为大家分享了介绍了java中文乱码之解决URL中文乱码问题的方法,感兴趣的小伙伴们可以参考一下
这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
Java关于中文乱码问题的多种解决方法,中文乱码过滤器
java解决中文乱码问题
java中文乱码解决问题