代码之家  ›  专栏  ›  技术社区  ›  Kevin Workman

在应用引擎devserver servlets中查看替换字符

  •  1
  • Kevin Workman  · 技术社区  · 6 年前

    我在用 App Engine's Maven plugin 要部署简单的servlet:

    package test;
    
    import java.io.IOException;
    
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/test")
    public class TestServlet extends HttpServlet{
    
      @Override
      public void doGet(HttpServletRequest request, HttpServletResponse response) 
          throws IOException {
    
        response.setContentType("application/json");
    
        String output = "testing ¡ ¿  ñ testing";
    
        response.getOutputStream().println(output);
      }
    }
    

    这个servlet输出一些包含特殊字符的文本,比如 ¡ , ¿ ñ .

    我运行本地开发服务器: mvn appengine:devserver

    我导航到 http://localhost:8080/test . 我看到这一点:

    testing � �  � testing
    

    我想这些是 replacement characters 并指出我的编码有问题。

    我试过专门设置字符集:

    response.setContentType("application/json; charset=UTF-8");
    

    我也尝试过:

    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    

    我已经确认浏览器在响应的标题中使用了此字符编码:

    devserver headers

    但是我仍然看到替换字符而不是原来的特殊字符。

    如果我部署到一个实况应用引擎站点,那么它工作正常,并显示原始的特殊字符。我看到现场有一个 content-encoding 属于 gzip 但这可能是一条红鲱鱼:

    live App Engine headers

    我在windows和linux上都试过,在这两个系统上都有相同的行为。

    如何设置本地开发服务器的编码,以便看到原始的特殊字符而不是替换字符?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Kevin Workman    6 年前

    结果我需要打电话 response.getWriter().println(output) 而不是 response.getOutputStream().println(output) .

    JavaDoc 对于 HttpServletResponse :

    • getOutputStream() 返回A ServletOutputStream 适用于在响应中写入二进制数据。servlet容器不编码二进制数据。

    • getWriter() 返回A PrintWriter 可以向客户端发送字符文本的对象。这个 字符打印流 使用返回的字符编码 getCharacterEncoding() .