TOMCAT 下中文乱码问题解决集锦/Java/JSP中文乱码问题解决
2010-03-30 09:44
676 查看
现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。
1)JSP页面中显示中文乱码
在JSP文件中使用page命令指定响应结果的MIME类型,如<%@pagelanguage="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中文字符集问题
配置Tomcat中文字符集问题
觉得还是要写出来,免的要用的时候遍地找牙耽搁时间.
文件:
%Tomcat_home%/conf/web.xml
修改位置:
<Connectorport="8080"maxThreads="150"minSpareThreads="25"
.........
在该Connector标签中添加项URIEncoding="GBK"useBodyEncodingForURI="true"
保存重启服务即可.
javaweb应用文件下载(包括中文文件名乱码处理)
url:
Javaweb下载文件功能的确很简单。如下代码片段StringfileName="....";
response.setHeader("Content-disposition","attachment;filename="+fileName);
//response.setContentType("application/ms-word");
BufferedInputStreambis=null;
BufferedOutputStreambos=null;
try{
bis=newBufferedInputStream(newFileInputStream(getServletContext().getRealPath(""+fileName)));
bos=newBufferedOutputStream(response.getOutputStream());
byte[]buff=newbyte[2048];
intbytesRead;
while(-1!=(bytesRead=bis.read(buff,0,buff.length))){
bos.write(buff,0,bytesRead);
}
}catch(finalIOExceptione){
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="+newString(fileName.getBytes("gb2312"),"ISO8859-1"));将中文名编码为ISO8859-1的方式。不过该编码只支持简体中文.
按照上诉方式,可以综合一下两种方式解决绝大部分中文问题。
fileName=URLEncoder.encode(fileNameSrc,"UTF-8");
if(fileName.length()>150)//解决IE6.0bug
fileName=newString(fileNameSrc.getBytes("GBK"),"ISO-8859-1");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
java实现文件下载并解决中文文件名乱码问题
url:
2009-07-0719:07
*下载文件
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@return
*@throwsException
*/
publicvoiddownLoadFile(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
//得到该文件在数据库中的信息
intfileId=Integer.parseInt(request.getParameter("fileId").toString());
FileInfofile=fileInfoBiz.getFileInfoByFileId(fileId);
try{
Stringfilepath=file.getFilePath()+"//"+file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件路径
Stringfilename=file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件名字
//解决中文文件名乱码问题
if(request.getHeader("User-Agent").toLowerCase().indexOf("firefox")>0)
filename=newString(filename.getBytes("UTF-8"),"ISO8859-1");//firefox浏览器
elseif(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");
ServletOutputStreamsos=response.getOutputStream();
FileInputStreamfis=null;
Filed=newFile(filepath);
if(d.exists()){
fis=newFileInputStream(filepath);
byteb[]=newbyte[1000];//输入流的读取速率
intj;
while((j=fis.read(b))!=-1){
try{
sos.write(b,0,j);
}
catch(IOExceptionexp){
MyLog.error("文件流写入错误",exp);
}
}
fis.close();
sos.flush();
sos.close();
}
}catch(Exceptione){
MyLog.error("下载文件出错",e);
//returnmapping.findForward("page_error");
}
//returntoFileMain(mapping,form,request,response);
}
以下载方式导出xls文件赠送解决中文文件名问题
url:
最近需要一个功能点击导出按钮,导出一个xls文件用户指定保存路径。用的是jxlapi
先上代码:
Java代码
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代码
//上面是我自己的业务逻辑
//上面是我自己的业务逻辑
Java代码
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代码
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代码
//业务逻辑封装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代码
//关闭操作
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开始下载文件无转向页面
下面是截图,简单清晰明了。~
相关文章推荐
- Eclipse,tomcat及jsp-java编码的设定解决的中文乱码问题
- java中解决从JSP页面获取中文乱码的问题
- Java/JSP中文乱码问题解决心得
- 解决jsp,tomcat,MYSQL下中文乱码问题
- centos7 javaweb 链接中文请求tomcat乱码问题解决
- JSP,mysql,tomcat下(基于struts2)中文及其乱码问题的解决
- JSP,mysql,tomcat下(基于struts2)中文及其乱码问题的解决
- Java/JSP中文乱码问题解决心得
- 在jsp中,获取页面中中文输入的值乱码问题解决。修改tomcat的编码问题
- tomcat服务器中文乱码问题集锦(servlet/jsp中文乱码)
- Java/JSP中文乱码问题解决心得(转载)
- Java/JSP中文乱码问题解决心得
- Tomcat JSP提交参数中文乱码问题解决
- Java/JSP中文乱码问题解决心得
- linux+tomcat struts 2 Jsp页面传值中文乱码问题解决方法
- Eclipse,tomcat及jsp页面编码的设定解决的中文乱码问题
- JavaBug库____tomcat配置解决中文乱码问题
- 解决jsp,tomcat,MYSQL下中文乱码问题
- java : JSP页面上中文乱码问题的解决经验
- Java/JSP中文乱码问题解决心得