在HTTPServlet请求中编码UTF-8

时间:2014-12-02 11:24:04

标签: java json http encoding utf-8

这可能看起来像一个已经解决的问题,但事实并非如此,因为我已经完成了所有与UTF-8相关的问题,但没有一个解决方案对我有所帮助。

我正在使用JSON简单库向包含JSON对象的java servlet发送http请求。

  1. 我在Tomcat xml文件中添加了UTF-8编码
  2. 我的HTML页面支持UTF-8编码
  3. 我的数据库和我的所有表都是UTF-8编码的
  4. 我使用系统变量将JVM的默认编码更改为UTF-8(是的!这是我多么绝望)
  5. 这是我的调度员功能:

        protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
    
        request.setCharacterEncoding("UTF-8");
    
        AjaxParser cr = AjaxParser.ClientRequestFactory();
        ClientRequest msg = cr.ParseClientAjax(request);
    
    
        HandleRequest HR = new HandleRequest();
        HandleRequestStatus HRS = HR.HandleMessage(msg);
    
        AjaxResponseGenerator ARG = new AjaxResponseGenerator();
        JSONObject jsonObj = ARG.HandleResponse(HRS);
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        System.out.println(jsonObj);// write the json object to console
        out.println(jsonObj);
    
    }
    

    这就是我如何解析String:

        public ClientRequest ParseClientAjax(HttpServletRequest request) {
    
        ClientRequest msg = new ClientRequest();
        StringBuffer jb = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null)
                jb.append(line);
        } catch (Exception e) { 
            e.printStackTrace();
        }
    
        JSONParser parser = new JSONParser();
        try {
            JSONObject obj = (JSONObject) parser.parse(jb.toString());
    
            String opcodeString = (String) obj.get("opcode");
            RequestCodeEnum numericEnumCode = (RequestCodeEnum) OpCodesMap
                    .get(opcodeString);
            msg.setOpCode(numericEnumCode);
    
            String entityStr = obj.get("Entity").toString();
    
            Entity entity = makeEntityFromString(numericEnumCode, entityStr);
            msg.setEntity(entity);
    
        } catch (ParseException pe) {
            System.out.println(pe);
        }
        return msg;
    }
    

    我尝试通过打印到Eclipse控制台(我也改为UTF-8编码)进行一些调试,我在整个应用程序中发送的文本找出文本编码不正确的地方,我发现文本是以正确的编码直到我的查询执行之前。之后,我手动检查数据库,并将文本作为问号插入。

    我尝试使用Workbench手动将非英语文本插入到我的数据库中,它在数据库本身以及之后在HTML中显示数据时都能正常工作。 只有当我从网页插入数据时才会出现问题。

    我被困住了,我不知道问题可能在哪里。

    有什么建议吗?

1 个答案:

答案 0 :(得分:3)

试试这个:

InputStream inputStream = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream , StandardCharsets.UTF_8));