在App Engine Devserver Servlet中看到替换字符

时间:2019-01-04 19:28:44

标签: java google-app-engine servlets character-encoding google-cloud-platform

我正在使用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

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

如果我部署到一个在线App Engine网站,则它可以正常工作并显示原始特殊字符。我看到该实时站点的content-encoding中的gzippostgres,但这可能是一个红色的鲱鱼:

live App Engine headers

我已经在Windows和Linux上都进行了尝试,并且在这两者上都得到了相同的行为。

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

1 个答案:

答案 0 :(得分:1)

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

JavaDocHttpServletResponse

  • getOutputStream()返回适合在响应中写入二进制数据的ServletOutputStream。 servlet容器不对二进制数据进行编码。

  • getWriter()返回一个PrintWriter对象,该对象可以将字符文本发送到客户端。 PrintWriter使用getCharacterEncoding()返回的字符编码。