您的位置:首页 > 运维架构 > Tomcat

TOMCAT 下中文乱码问题解决集锦/Java/JSP中文乱码问题解决

2010-03-30 09:44 676 查看
如何解决Tomcat下中文乱码问题?

http://www.javaeye.com/topic/251743

现在将常见的乱码问题分为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中文字符集问题

http://dilantaya20070723211817.javaeye.com/blog/252571
配置Tomcat中文字符集问题
觉得还是要写出来,免的要用的时候遍地找牙耽搁时间.
文件:
%Tomcat_home%/conf/web.xml
修改位置:
<Connectorport="8080"maxThreads="150"minSpareThreads="25"
.........
在该Connector标签中添加项URIEncoding="GBK"useBodyEncodingForURI="true"
保存重启服务即可.








javaweb应用文件下载(包括中文文件名乱码处理)

url:http://blog.csdn.net/lovingprince/archive/2008/07/18/2671580.aspx

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:http://hi.baidu.com/paladian1/blog/item/0af4a1170bb00d4320a4e9c9.html
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:http://www.javaeye.com/topic/742753

最近需要一个功能点击导出按钮,导出一个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开始下载文件无转向页面

下面是截图,简单清晰明了。~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: