【问题标题】:Encoding UTF-8 in HTTPServlet request在 HTTPServlet 请求中编码 UTF-8
【发布时间】:2014-12-02 11:24:03
【问题描述】:

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

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

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

这是我的调度函数:

    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);

}

这就是我对字符串进行解析的方式:

    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 中显示数据时都可以正常工作。 仅当我从网页插入数据时才会出现此问题。

我卡住了,我不知道问题可能出在哪里。

有什么建议吗?

【问题讨论】:

  • 您发布的代码看起来没问题。问题一定出在其他地方。
  • @icza 你的意思是别的什么地方?除了 tomcat 和数据库,我应该在哪里检查编码?
  • 我的意思是你的代码。检查文本输入或输出String 对象的每个位置。例如,当您将文本插入数据库或从中读取时。

标签: java json http encoding utf-8


【解决方案1】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2012-08-30
    相关资源
    最近更新 更多