字符集系列一之痛苦的resin

来源:互联网 发布:php伪造referer跳转 编辑:程序博客网 时间:2024/06/10 13:06

本机环境:windows2000 professional 简体中文版

服务器环境:Linux BSD 2.4.26

resin运行系统变量:LANG:zh_CN,LC_ALL:空

一个字符集的问题,折磨了我大半天,终于找到了原因,发给大家,遇到了就不要再这么痛苦了。

    这是一个特别简单的例子,我们在HttpRequest中有一个字“碁”,比较特殊,存盘后成为“?”。这个字在GBK中存在,在gb2312字符集中不存在。
 
    servlet中是这么处理的:
        chineseName=upLoadRequest.getParameter("cname");
    非常标准的用法,在本机环境中测试正常,放到服务器上存盘乱码。
   
    其形成原因有两点:
    1、服务器上的字符集为gb2312,不支持此字。
    2、resin的httpRequest实现与其他服务器不同.
    大多服务器的请求流都是以"ISO8895-1"字符集为默认实现,此时标准正确的处理方法为:
        chineseName=upLoadRequest.getParameter("cname");
        chineseName=StringUtil.iso2gbk(chineseName);
    但是在resin中,由于httpRequest.getParameter对象返回的是本地默认编码的字符串,服务器上也就是gb2312,导致出现乱码现象,而windows中文版下就是GBK,所以正常。
 
    这是从现象中总结出来的,与网上说的resin的情况不是很相符,不知是我的resin版本太老还是理解错误,不过,只需要将linux下的启动环境变量,lang,lc_all改变一下( LANG=zh_CN; LC_ALL=zh_CN.GBK; export LANG LC_ALL 设置),就可以解决问题。
    如果哪位知道更加详细准确的关于resin的字符集处理的资料,请务必同志我,不甚感激。
原创粉丝点击