首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts2中文有关问题

2012-11-01 
struts2中文问题说起来,接触struts2也已经差不多半个月了,虽然期间断断续续的看过一些书,但是花的时间并不

struts2中文问题
说起来,接触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" 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


<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"/>
downloadName = URLEncoder.encode(downloadName, Constants.ENCODING);
设置的系统常量UTF-8 8 楼 yipbxx 2010-01-29   页面加上 pageEncoding="UTF-8",在配置个过滤器看看,修改tomcat编码集一般不建议这样做吧 9 楼 huhuanqadn 2010-01-29   我一直是保证页面编码与容器编码一致的,这样是不会出现乱码的。 10 楼 Purking 2010-01-30   luckaway 写道fansofjava 写道暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果
真修改服务器的编码方式,那
struts.i18n.encoding=UTF-8拿来又有何用?
tomcat5.0之后post提交和get提交编码已经分开处理了!!!
虽然这个特性可能不是基于Servlet规范的,但是把两个编码设置成一致,绝对不会只跟tomcat这个特定容器绑定死,相反如果你get编码和post编码不一致,才有可能导致无法迁移到其他容器去,因为其他的容器可能并不支持分开设置,意味着你只能称设置一个编码。

所以,建议LZ把两个编码设置成一样!


支持, 并且汉字乱码问题 GET 与 POST 参数的提交的处理方式是不同的;
对于 Struts2 内置的汉字编码过滤器我研究过, 可以看看我的 Blog:
      blog.csdn.net/Purking

热点排行