我正在使用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");
我已经确认浏览器在响应的标题中获得了此字符编码:
但是我仍然看到替换字符,而不是原始的特殊字符。
如果我部署到一个在线App Engine网站,则它可以正常工作并显示原始特殊字符。我看到该实时站点的content-encoding
中的gzip
为postgres
,但这可能是一个红色的鲱鱼:
我已经在Windows和Linux上都进行了尝试,并且在这两者上都得到了相同的行为。
如何设置本地开发服务器的编码,以便可以看到原始的特殊字符而不是替换字符?
答案 0 :(得分:1)
结果是我需要打电话给response.getWriter().println(output)
而不是response.getOutputStream().println(output)
。
从JavaDoc到HttpServletResponse
:
getOutputStream()
返回适合在响应中写入二进制数据的ServletOutputStream
。 servlet容器不对二进制数据进行编码。
getWriter()
返回一个PrintWriter
对象,该对象可以将字符文本发送到客户端。 PrintWriter
使用getCharacterEncoding()
返回的字符编码。