Просмотр заменяющих символов в сервлетах Dev Engine сервера приложений - PullRequest
0 голосов
/ 04 января 2019

Я использую плагин Maven App Engine для развертывания простого сервлета:

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);
  }
}

Этот сервлет выводит некоторый текст, который содержит специальные символы, такие как ¡, ¿ и ñ.

Я запускаю локальный сервер разработки: mvn appengine:devserver

И я перехожу к http://localhost:8080/test. Я вижу это:

testing � �  � testing

Я понял, что это заменяющие символы и указывают, что что-то не так с моей кодировкой.

Я пытался специально установить кодировку:

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

Я также пробовал:

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

Я подтвердил, что браузер получает эту кодировку символов в заголовках ответа:

devserver headers

Но я по-прежнему вижу заменяющие символы вместо оригинальных специальных символов.

Если я разверну на живом сайте App Engine, он будет работать нормально, и будут показаны оригинальные специальные символы. Я вижу, что живой сайт имеет content-encoding из gzip, но это может быть красная сельдь:

live App Engine headers

Я пробовал это как на Windows, так и на Linux, и у меня одинаковое поведение на обоих.

Как настроить кодировку локального сервера разработки, чтобы я мог видеть оригинальные специальные символы вместо символов замены?

1 Ответ

0 голосов
/ 06 января 2019

Оказывается, мне нужно было позвонить response.getWriter().println(output) вместо response.getOutputStream().println(output).

Из JavaDoc для HttpServletResponse:

  • getOutputStream() возвращает ServletOutputStream, пригодный для записи двоичных данных в ответе. Контейнер сервлета не кодирует двоичные данные.

  • getWriter() возвращает объект PrintWriter, который может отправлять текстовый символ клиенту. PrintWriter использует кодировку символов, возвращаемую getCharacterEncoding().

...