web-dev-qa-db-ja.com

UTF-8エンコーディングでServletOutputStream文字を介して送信する方法

私のサーブレットコードは次のようになります。

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)

サーブレットの出力ストリームの文字セットを切り替える方法は?

48
GyRo

代わりに getWriter() を使用したいと思います。これは文字列を受け入れてエンコードしますが、出力ストリームはbinaryデータを処理するためのものです。

ドキュメントから:

クライアントに文字テキストを送信できる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...);
94
Brian Agnew

これも機能します:

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

以前にも同じことが起こり、PrintWriterの上に1行追加しようとしましたが、うまくいきました。

response.setContentType( "text/html; charset = GBK");
PrintWriter out = response.getWriter();

3
Chang
public void output(String jsonStr, HttpServletResponse response) throws IOException {
    response.setContentType("text/html;charset=UTF-8;");
    response.setCharacterEncoding("UTF-8");
    ServletOutputStream out = response.getOutputStream();
    out.write(jsonStr.getBytes("UTF-8"));
    out.flush();
    out.close();
}
0
Allen