设为首页 收藏本站
查看: 597|回复: 0

[经验分享] TOMCAT 下中文乱码问题解决集锦/Java/JSP中文乱码问题解决

[复制链接]
YunVN网友  发表于 2017-2-9 11:13:02 |阅读模式
  如何解决Tomcat下中文乱码问题?
  http://www.javaeye.com/topic/251743
  现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。
  1)JSP页面中显示中文乱码
  在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb2312" %>
  2)表单提交乱码
  表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
(1)POST处理
对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:



  • packageexample.util;


  • importjava.io.IOException;


  • importjavax.servlet.Filter;

  • importjavax.servlet.FilterChain;

  • importjavax.servlet.FilterConfig;

  • importjavax.servlet.ServletException;

  • importjavax.servlet.ServletRequest;

  • importjavax.servlet.ServletResponse;


  • publicclassSetCharacterEncodingFilterimplementsFilter{


  • protectedStringencoding=null;


  • protectedFilterConfigfilterConfig=null;


  • protectedbooleanignore=true;



  • publicvoiddestroy(){


  • this.encoding=null;

  • this.filterConfig=null;

  • }


  • publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
  • <strong><spanstyle="color:rgb(255,0,0);">FilterChainchain)throwsIOException,ServletException{


  • if(ignore||(request.getCharacterEncoding()==null)){
  • Stringencoding=selectEncoding(request);

  • if(encoding!=null){
  • request.setCharacterEncoding(encoding);
  • }
  • }</span>
  • </strong>
  • //Passcontrolontothenextfilter
  • chain.doFilter(request,response);

  • }

  • publicvoidinit(FilterConfigfilterConfig)throwsServletException{


  • this.filterConfig=filterConfig;

  • this.encoding=filterConfig.getInitParameter("encoding");
  • Stringvalue=filterConfig.getInitParameter("ignore");

  • if(value==null){

  • this.ignore=true;
  • }elseif(value.equalsIgnoreCase("true")){

  • this.ignore=true;
  • }elseif(value.equalsIgnoreCase("yes")){

  • this.ignore=true;
  • }else{

  • this.ignore=false;
  • }

  • }


  • protectedStringselectEncoding(ServletRequestrequest){


  • return(this.encoding);

  • }

  • }


  文中红色的代码即为处理乱码的代码。
web.xml文件加入过滤器

Xml代码






  • <filter>

  • <filter-name>Encoding</filter-name>

  • <filter-class>
  • example.util.SetCharacterEncodingFilter

  • </filter-class>

  • <init-param>

  • <param-name>encoding</param-name>

  • <param-value>gbk</param-value>
  • <!--gbk或者gb2312或者utf-8-->

  • </init-param>

  • <init-param>

  • <param-name>ignore</param-name>

  • <param-value>true</param-value>

  • </init-param>

  • </filter>




Xml代码






  • <filter-mapping>

  • <filter-name>Encoding</filter-name>

  • <servlet-name>/*</servlet-name>

  • </filter-mapping>


  (2) Get方法的处理
tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
打开<tomcat_home>/conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:


Java代码





  • <Connectorport="8080"maxHttpHeaderSize="8192"
  • maxThreads="150"minSpareThreads="25"maxSpareThreads="75"
  • enableLookups="false"redirectPort="8443"acceptCount="100"
  • connectionTimeout="20000"disableUploadTimeout="true"<spanstyle="color:rgb(255,0,0);">URIEncoding="GBK"</span>/>

    * 注意修改后重新启动tomcat才能起作用。



配置Tomcat 中文字符集问题



http://dilantaya20070723211817.javaeye.com/blog/252571

配置Tomcat 中文字符集问题
觉得还是要写出来,免的要用的时候遍地找牙耽搁时间.
文件:
%Tomcat_home%/conf/web.xml
修改位置:
<Connector port="8080" maxThreads="150" minSpareThreads="25"
.........
在该Connector标签中添加项URIEncoding="GBK" useBodyEncodingForURI="true"
保存重启服务即可.
  java web应用文件下载(包括中文文件名乱码处理)
  url: http://blog.csdn.net/lovingprince/archive/2008/07/18/2671580.aspx
  Java web下载文件功能的确很简单。如下代码片段String fileName ="....";
response.setHeader("Content-disposition","attachment; filename="+fileName);
//response.setContentType("application/ms-word");
  BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(getServletContext().getRealPath("" + fileName)));
bos = new BufferedOutputStream(response.getOutputStream());
  byte[] buff = new byte[2048];
int bytesRead;
  while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff,0,bytesRead);
}
  } catch(final IOException e) {
System.out.println ( "IOException." + e );
  } finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
  如上所示,已经可以完成下载的功能。不过如果我们使用中文文件名,那么这段代码便会出错,解决办法有多种方式,如下:
  第一种: 设置 response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));这里将文件名编码成UTF-8的格式,就不会出现URL出错了。IE6下注意中文文字不能超过超过17个。
  
  第二种:设置response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );将中文名编码为ISO8859-1的方式。不过该编码只支持简体中文.
  按照上诉方式,可以综合一下两种方式解决绝大部分中文问题。
  fileName = URLEncoder.encode(fileNameSrc,"UTF-8");
  if(fileName.length()>150)//解决IE 6.0 bug
   fileName=new String(fileNameSrc.getBytes("GBK"),"ISO-8859-1");
  response.setHeader( "Content-Disposition", "attachment;filename=" + fileName);

java实现文件下载并解决中文文件名乱码问题

url: http://hi.baidu.com/paladian1/blog/item/0af4a1170bb00d4320a4e9c9.html


2009-07-07 19:07

[tr][td]


[/td][/tr]  /**
* 下载文件
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public void downLoadFile(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//得到该文件在数据库中的信息
int fileId = Integer.parseInt(request.getParameter("fileId").toString());
FileInfo file = fileInfoBiz.getFileInfoByFileId(fileId);
try{
String filepath = file.getFilePath()+"//"+file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件路径
String filename = file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件名字
//解决中文文件名乱码问题
if(request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0)
filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
else if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0)
filename = URLEncoder.encode(filename, "UTF-8");//IE浏览器
  /**
* 如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等
* 文件下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打
* 开,有些也可以正常打开。同时response.reset()这种方式也能清空缓冲区, 防止页面中的空
* 行等输出到下载内容里去
*/
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=/"" + filename + "/"");
response.setHeader("Connection", "close");
  ServletOutputStream sos = response.getOutputStream();
FileInputStream fis = null;
File d = new File(filepath);
if (d.exists()){
fis = new FileInputStream(filepath);
byte b[] = new byte[1000]; //输入流的读取速率
int j;
while ((j = fis.read(b)) != -1){
try{
sos.write(b, 0, j);
}
catch (IOException exp){
MyLog.error("文件流写入错误", exp);
}
}
fis.close();
sos.flush();
sos.close();
}
}catch(Exception e){
MyLog.error("下载文件出错", e);
//return mapping.findForward("page_error");
}
//return toFileMain(mapping, form, request, response);
}


  以下载方式导出xls文件 赠送解决中文文件名问题
  url: http://www.javaeye.com/topic/742753
  最近需要一个功能 点击导出按钮,导出一个xls文件 用户 指定保存路径。 用的是 jxl api
  先上代码:

Java代码 http://www.javaeye.com/images/icon_copy.gif






  • publicStringxls(){

  • if(day==null){

  • this.pagination=propertyMng.findSumList(pageNo,getCookieCount());
  • }else{

  • if(day.equals("")){
  • DateFormatdf=newSimpleDateFormat("yyyy-MM-dd");
  • day=df.format(newDate());
  • }

  • this.pagination=propertyMng.findListByDay(day,pageNo,
  • getCookieCount());
  • }



Java代码 http://www.javaeye.com/images/icon_copy.gif






  • //上面是我自己的业务逻辑



//上面是我自己的业务逻辑
Java代码 http://www.javaeye.com/images/icon_copy.gif





  • HttpServletResponseresponse=ServletActionContext.getResponse();
  • StringfileName="强大.xls";

  • try{
  • fileName=newString(fileName.getBytes(),"iso8859-1");//解决中文文件名问题
  • }catch(UnsupportedEncodingExceptione1){
  • e1.printStackTrace();
  • }
  • response.setHeader("content-disposition","attachment;filename="
  • +fileName);//设定输出文件头
  • response.setContentType("application/msexcel");//定义输出类型
  • getInputStream(response);

  • returnnull;
  • }



Java代码 http://www.javaeye.com/images/icon_copy.gif






  • publicvoidgetInputStream(HttpServletResponseresponse){

  • try{
  • OutputStreamos=response.getOutputStream();
  • WritableWorkbookwwb=Workbook.createWorkbook(os);
  • WritableSheetws=wwb.createSheet("道具排行",0);
  • WritableFontwfc=newWritableFont(WritableFont.ARIAL,20,
  • WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,
  • Colour.GREEN);
  • WritableCellFormatwcfFC=newWritableCellFormat(wfc);
  • Labellabel1=newLabel(0,0,"道具",wcfFC);
  • ws.addCell(label1);
  • Labellabel2=newLabel(1,0,"数量",wcfFC);
  • ws.addCell(label2);



Java代码 http://www.javaeye.com/images/icon_copy.gif






  • //业务逻辑封装Label
  • List<PropertyUseInfoPOJO>list=pagination.getList();

  • inti=1;

  • for(PropertyUseInfoPOJOpojo:list){
  • Labelname=newLabel(0,i,pojo.getName());
  • ws.addCell(name);
  • Labelnum=newLabel(1,i,pojo.getNum());
  • ws.addCell(num);
  • i++;
  • }



Java代码 http://www.javaeye.com/images/icon_copy.gif






  • //关闭操作
  • wwb.write();
  • wwb.close();
  • os.close();
  • }catch(IOExceptione){
  • //TODOAuto-generatedcatchblock
  • e.printStackTrace();
  • }catch(RowsExceededExceptione){
  • //TODOAuto-generatedcatchblock
  • e.printStackTrace();
  • }catch(WriteExceptione){
  • //TODOAuto-generatedcatchblock
  • e.printStackTrace();
  • }
  • }




  感觉挺简单的。 构建输出流 主要是 Label 对象 相当于 单元格
  WritableCellFormat 对象 相当于设置样式
  往 WritableSheet 添加 Label 就构建了一个xls结构
  点击button 开始下载文件 无转向页面
  下面是截图 ,简单清晰明了。~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-339700-1-1.html 上篇帖子: 两种jdk版本的多个tomcat按windows服务的安装问题的解决 下篇帖子: tomcat和jetty对静态资源的处理和客户端缓存的处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表