记一则因编码造成的接口对接问题

某高校的短信接口对接,本地测试一切正常,部署到服务器却不正常,review代码发现含有如下代码:

public String getMD5(String str) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(str.getBytes());
        return new BigInteger(1, md.digest()).toString(16);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "";
}

这个取md5的方法在含有中文时,因环境的编码问题会造成得到的MD5不一致,故需要将标红的部分更改为
md.update(str.getBytes("UTF-8"));

即传入编码所使用的字符集即可。

同时,这边另外一个短信接口,发送时要求使用POST提交,也同样遇到了编码问题,解决方法同样简单:
使用标红的部分对编码进行下强制指定,就好咯 :)
HttpClient httpClient = new HttpClient();
PostMethod method = new PostMethod(url);
method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");

在不同编码的页面间通过表单传递参数乱码的问题

今天遇到一个很神奇的问题,用户告诉我这边网站上的表单提交到查询系统之后得不到返回值,查询结果是0条记录,但是再本地纯html执行的结果却能搜索到值。自己验证了下,果然如此,而且比对两边GET提交的参数,除了有个字段的值不同外,参数个数这些都是相同的,故考虑有可能是编码问题造成的影响。

分别打开两个文件后查看,发现两边编码确实不一致,而服务器那边为GB2312,传递UTF-8编码的参数过去不能正常解析出来,故放狗搜索,查找到form上一个很少用的属性。

accept-charset=”gb2312″

这个属性很有意思,可以设置表单以什么编码对内容进行编码,所以,给form 加上这个属性,就好了。

不过很恶心的,IE对这个属性不支持,于是只好对表单的onSubmit()方法进行下hack,加上

onsubmit=”document.charset=’gb2312′;”

问题彻底解决。