注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

JavaWeb开发手记:浏览器输出中文乱码的解决过程  

来自隋相   2015-11-05 15:40:13|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
场景是这样的:JavaWeb工程,服务器使用tomcat8.0,项目构建使用maven,IDE使用Eclipse EE版。我的service中的某个类需要解析某个resource中的A文件(文件中有中文字符),然后servlet需要将这个类解析A文件的结果用EL表达式传递给jsp页面,也就是需要浏览器输出中文字符。项目打包后成功部署至服务器上,浏览器输入地址,回车后发现EL表达式部分输出中文乱码,jsp页面html输出中文部分没有乱码。就是这样:
JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team

 解决过程step1:
为了解决中文乱码的问题,首先需要了解前后端交互过程中数据编码译码的原理与过程才能定位问题,如下图所示:
JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team
 由于这里我涉及的场景只是服务器端要发送给客户端的数据(get请求),因而只涉及图片下半段的过程。我们看到关键的就是编码解码的过程,Encode与Decode。也就是服务器收集要发送给客户端的数据,将数据进行编码(Encode),然后再使用浏览器当前字符集进行解码(Decode),既可以展示在浏览器中正确的数据。分别分析这两个过程。

Encode:服务器将传送的数据进行编码时的字符集设置是在server.xml(tomcat安装文件夹-〉conf文件夹下)中通过Connector连接器类元素设置的。Connector元素主要用于直接与用户交互的组件,负责接受用户请求和向客户返回响应结果。默认情况下对于客户端get请求,tomcat返回数据的编码格式是ISO8859-1,一般情况下为了使得中文数据能够正确编码,我们将编码格式改为UTF-8。也就是下图:
JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team
 红框内是新增的参数,这样的话就保证了编码encode的规则是utf-8。

Decode:客户端浏览器当前字符集的设置一般是在jsp文件头进行设置的,也可以直接在浏览器的工具-〉编码中查看。看了下我的jsp页面头部是这样写的:
JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team
 设置为UTF-8,同Encode编码方式一致呢。现在应该没有问题了,去试试。
这次不需要重新打包工程了,只需要重启Tomcat即可。重启完后,再次打开链接,这时候看到页面展示还是老样子,也就是依然EL表达式部分输出乱码。

 解决过程step2:
接下来想想问题不是出现在服务器encode,也不是客户端decode上,而应该是服务器本身处理的这部分待encode的数据可能就有问题!于是重新查看了下服务器处理resouce中的A文件过程,由于A文件里有中文,很有可能是读取文件的时候没有把中文正确解析,验证下~这时候我在servlet中把要发给客户端的这部分数据打印了出来,由于encode与decode编码方式都设置为UTF-8,所以tomcat中打印出来是什么说明它本身就是什么。
重新打包编译下部署到服务器上,链接刷新,看到tomcat中打印出来了数据:
 JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team
也就是说服务器要给客户端的数据本身就是乱码!这也难怪修改编码设置也没有用了。
这也进一步证明了是读取A文件时候没有正确把中文解析。我读取文件时候的代码是这样写的:
File file = new File(path);
BufferedReader bw = new BufferedReader(new FileReader(file));

解决过程step3:
查了下网上关于java处理IO的原理,java i/O处理的主要过程如下:
Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集。
JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team
所以这里就需要显式地指定出java读取A文件采用的字符集。也就是读取文件的代码修改为:
File file = new File(path);
BufferedReader bw = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
这下再重新打包编译部署试试看~
JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team
 tomcat输出是正确的中文,不是乱码!再看下浏览器:
 JavaWeb开发手记:浏览器输出中文乱码的解决过程 - 网易杭州QA - 网易杭州 QA Team
也正常了!
至此,终于解决了jsp页面输出乱码的问题,归根结底原来是java读取中文文件没有设置字符集的原因。
 
 
  评论这张
 
阅读(423)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016