无法解码我的servlet中的西里尔字符串

时间:2013-08-22 12:29:16

标签: java servlets utf-8 character-encoding

最近我正在开发一个新项目,UTF-8是必须的。我不知道为什么我要面对这个,但这对我来说真的很奇怪。我真的尝试过我所知道的一切,但问题仍然存在。

我正在向我的servlet发送一个JSON字符串,这里是servlet部分:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    request.setCharacterEncoding("UTF-8");
    if (action.equals("startProcess")) {
        final String data = request.getParameter("mainData");
        URLDecoder.decode(data, "UTF-8");

        System.out.println("DATA \n" + URLDecoder.decode(data, "UTF-8"));
        JSONObject jsonObj = new JSONObject();
        try {


            JSONArray jsonArr = new JSONArray(URLDecoder.decode(data, "UTF-8"));
            jsonObj.put("data", jsonArr);
            JSONArray array = jsonObj.getJSONArray("data");
            System.out.println("insertDtls \n" + jsonObj.toString());

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}

System.out.println("insertDtls \n" + jsonObj.toString());返回:

此结果:DATA [{"department":"1"},{"stampType":"кÑÑÐ³Ð»Ð°Ñ Ð¿ÐµÑаÑÑ"},{"headCompany":"да"},{"stampReason":"1"},{"textToPrint":"asd"},{"comments":"da"},{"other":"дÑÑгой"}]

我真的不知道该怎么做。我确定我错过了一些非常小的东西,但我无法发现它。是否有可能以某种方式对此字符串进行双重编码?

2 个答案:

答案 0 :(得分:3)

String data = request.getParameter("mainData");

request.getParameter()已经解码了mainData参数。无需进一步解码:URLDecoder.decode(data, "UTF-8")

如果您仍想获取原始mainData参数值,请使用request.getQueryString()然后对其进行解码:URLDecoder.decode(request.getQueryString(), "UTF-8");


在客户端,请确保在发送GET请求时,所有URL参数都是正确的UTF-8编码。 同样在服务器端,确保您的GET参数是UTF-8解码的。例如,要在Tomcat中修复它,您必须在server.xml中配置 URIEncoding 属性:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" ...>

答案 1 :(得分:-2)

尝试使用-Dfile.encoding = UTF-8参数运行java进程。