论坛首页 Java企业应用论坛

struts2中文问题

浏览 5736 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-26   最后修改:2010-01-26
说起来,接触struts2也已经差不多半个月了,虽然期间断断续续的看过一些书,但是花的时间并不多,认识也不是很到位。但是工作需要,也顾不了那么多了。struts2在中文的处理方面并没提供多大帮助,虽然内置个
<constant name="struts.i18n.encoding" value="UTF-8" />


关于这个变量,已经有人讨论过了,主要是对request,response的编码处理,在以前解决jsp+Servlet或struts乱码时,的确是加个过滤器,然后将request的Encoding设为UTF-8,但是struts2的struts.i18n.encoding看似与此过滤器差不多,还多做了点事(response),但是在传中文参数的时候还是会出现乱码:

<tr>
<td><s:property /></td>
<td>
<a href="<s:url value='download.action'>  <s:param name='fileName'
 value='fileFileName[#fn.getIndex()]'/>  
 </s:url>">下载</a>
</td>
</tr>



如果上面的文件名为中文,在action里面打印出的文件名还是乱码。于是开始怀疑struts.i18n.encoding这个参数到底起作用没有,经过在action的验证:

getRequest().getCharacterEncoding()


这个encoding确实是UTF-8,说明request的参数编码的确为UTF-8,那为什么中文文件名还是乱码呢?这个问题目前还不能合理的解释。于是只好手动来转码了:

String chineseFileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");


虽然不能解释,但是这样做,的确能得到中文的文件名。但是还有另一个问题又产生了,下载中文文件名的附件会出现乱码问题。

public String getDownloadChineseFileName() throws UnsupportedEncodingException {
		String downloadChineseFileName = fileName;
		
		String chineseFileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
		
		return downloadChineseFileName;
	}


<action name="download" class="com.example.DownLoadAction">
			<param name="fileName"></param>
			<result name="success" type="stream">
				<param name="contentType">application/octet-stream</param>
				<param name="inputName">downloadFile</param>
				<param name="contentDisposition">
					attachment;filename="${downloadChineseFileName}"
				</param>
				
			</result>
		</action>


至少上面的中文文件名作为下载附件的名字时为乱码。

既然action内都是中文了,为什么下载的时候还会出现乱码呢?心想可能转过码的缘故,于是不转码了:

public String getDownloadChineseFileName() throws UnsupportedEncodingException {
		return fileName;
	}


然后测试,结果附件名成中文了,高兴了一下,但是不要慌,这只是在FF下的测试,在IE7上试了一下,结果依然乱码,我晕!这下让人犯难了,转与不转都有问题,该怎么办?没办法了,解决不了,于是去掌门人上玩了几把dota:奇怪的是,输的时候总是输得很干脆,赢的时候却总是赢得很艰难,每次赢的时候大家都神装了,打得那个吃力呀!
玩过几把后,回到原来的话题,中文附件问题到底该怎么办?心想,到action里既然是乱码,应该那是得转码,但是UTF-8码的确是有问题,于是把中文的文件名再转成ISO8859-1,我把上好的中文名再转成ISO8859-1,应该不会有问题了吧?于是这样:
public String getDownloadChineseFileName() throws UnsupportedEncodingException {
		String downloadChineseFileName = fileName;
		
		String chineseFileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
		downloadChineseFileName = new String( chineseFileName.getBytes(), "ISO8859-1" );

		return downloadChineseFileName;
	}


经过FF与IE的测试都正常了,问题解决了。
后经过同事测试,发现编写下载链接代码时,如果直接使用<a href=....>时,如果中文的文件名太长,会出现 中文文件名+乱码+文件扩展名的情况,如中华人民共和国草案??.doc。因此最好还是用s:url标签。
不管怎么说,中文附件名的问题终于解决了,接触struts2时间不长,但是发现搞个东西还真不容易。因此撰写此文,希望能给哪怕只一个人提供一顶儿帮助也好。



PS:测试环境为
struts2.1.8.1
tomcat6.0.18

   发表时间:2010-01-27  
那是因为你的tomcat 容器或者was对url还进行了一次转码吧?
0 请登录后投票
   发表时间:2010-01-27  
楼主用的是不是IE6的浏览器?上次也遇到一个类似的问题,在IE6下面,url后面如果跟中文,并且为13个汉字就会出现乱码问题。在IE7下面每页这个错误。
0 请登录后投票
   发表时间:2010-01-27   最后修改:2010-01-27
虽然IE下的确有很多问题,但是还是不明白为什么struts.i18n.encoding=UTF-8没起作用。虽然在action内获取的request编码依然为UTF-8,但是参数为什么还是乱码,还得转码?
0 请登录后投票
   发表时间:2010-01-28   最后修改:2010-01-28
withoutmark 写道
那是因为你的tomcat 容器或者was对url还进行了一次转码吧?

正解:只要配置tomcat的connect加上编码就可以了:useBodyEncodingForURI="true" URIEncoding="UTF-8"
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/xml"/>
0 请登录后投票
   发表时间:2010-01-28  
暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果
真修改服务器的编码方式,那
struts.i18n.encoding=UTF-8拿来又有何用?
0 请登录后投票
   发表时间:2010-01-28   最后修改:2010-01-28
fansofjava 写道
暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果
真修改服务器的编码方式,那
struts.i18n.encoding=UTF-8拿来又有何用?

tomcat5.0之后post提交和get提交编码已经分开处理了!!!
虽然这个特性可能不是基于Servlet规范的,但是把两个编码设置成一致,绝对不会只跟tomcat这个特定容器绑定死,相反如果你get编码和post编码不一致,才有可能导致无法迁移到其他容器去,因为其他的容器可能并不支持分开设置,意味着你只能称设置一个编码。

所以,建议LZ把两个编码设置成一样!
0 请登录后投票
   发表时间:2010-01-28  
下载我是这么做的
downloadName = URLEncoder.encode(downloadName, Constants.ENCODING);

设置的系统常量UTF-8
0 请登录后投票
   发表时间:2010-01-29  
页面加上 pageEncoding="UTF-8",在配置个过滤器看看,修改tomcat编码集一般不建议这样做吧
0 请登录后投票
   发表时间:2010-01-29  
我一直是保证页面编码与容器编码一致的,这样是不会出现乱码的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics