锁定老帖子 主题:struts2中文问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-26
最后修改:2010-01-26
<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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-27
那是因为你的tomcat 容器或者was对url还进行了一次转码吧?
|
|
返回顶楼 | |
发表时间:2010-01-27
楼主用的是不是IE6的浏览器?上次也遇到一个类似的问题,在IE6下面,url后面如果跟中文,并且为13个汉字就会出现乱码问题。在IE7下面每页这个错误。
|
|
返回顶楼 | |
发表时间:2010-01-27
最后修改:2010-01-27
虽然IE下的确有很多问题,但是还是不明白为什么struts.i18n.encoding=UTF-8没起作用。虽然在action内获取的request编码依然为UTF-8,但是参数为什么还是乱码,还得转码?
|
|
返回顶楼 | |
发表时间: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"/> |
|
返回顶楼 | |
发表时间:2010-01-28
暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果 真修改服务器的编码方式,那 struts.i18n.encoding=UTF-8拿来又有何用? |
|
返回顶楼 | |
发表时间:2010-01-28
最后修改:2010-01-28
fansofjava 写道 暂且不说,能不能通过修改server.xml来解决问题(很可能行),就算解决了,也是基于
特定容器,如果以后换作其它的服务器,是不是又要回过头来解决乱码问题呢?而且如果 真修改服务器的编码方式,那 struts.i18n.encoding=UTF-8拿来又有何用? tomcat5.0之后post提交和get提交编码已经分开处理了!!! 虽然这个特性可能不是基于Servlet规范的,但是把两个编码设置成一致,绝对不会只跟tomcat这个特定容器绑定死,相反如果你get编码和post编码不一致,才有可能导致无法迁移到其他容器去,因为其他的容器可能并不支持分开设置,意味着你只能称设置一个编码。 所以,建议LZ把两个编码设置成一样! |
|
返回顶楼 | |
发表时间:2010-01-28
下载我是这么做的
downloadName = URLEncoder.encode(downloadName, Constants.ENCODING); 设置的系统常量UTF-8 |
|
返回顶楼 | |
发表时间:2010-01-29
页面加上 pageEncoding="UTF-8",在配置个过滤器看看,修改tomcat编码集一般不建议这样做吧
|
|
返回顶楼 | |
发表时间:2010-01-29
我一直是保证页面编码与容器编码一致的,这样是不会出现乱码的。
|
|
返回顶楼 | |