如何以 UTF-8 编码通过 ServletOutputStream 字符发送

2022-08-31 16:03:47

我的 servlet 代码如下所示:

response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
ServletOutputStream out = response.getOutputStream();
out.println(...MY-UTF-8 CODE...);

...

然后我得到错误:

java.io.CharConversionException: Not an ISO 8859-1 character: ש
 javax.servlet.ServletOutputStream.print(ServletOutputStream.java:89)
 javax.servlet.ServletOutputStream.println(ServletOutputStream.java:242)
 rtm.servlets.CampaignLogicServlet.doPost(CampaignLogicServlet.java:68)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

如何切换Servlet输出流???


答案 1

我想你想使用getWriter()来代替。这将接受字符串并将其编码,而输出流用于处理二进制数据。

从文档:

返回一个 PrintWriter 对象,该对象可以将字符文本发送到客户端。使用的字符编码是在 setContentType(java.lang.String) 方法的 charset= 属性中指定的字符编码,必须在调用此方法之前调用该字符集才能使字符集生效。

可以调用此方法或 getOutputStream() 来编写正文,而不是两者兼而有之。

以下是代码的更改:

response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println(...MY-UTF-8 CODE...);

答案 2

这也有效:

ServletOutputStream out = response.getOutputStream();
out.write("MY-UTF-8 CODE".getBytes("UTF-8")); 

推荐