Когда веб-сервер получает http-запрос клиента, он создает объект запроса, представляющий запрос, и объект ответа, представляющий ответ для каждого запроса. Поскольку объекты запроса и ответа представляют собой запросы и ответы, если мы хотим получить данные, отправленные клиентом, нам нужно только найти объект запроса. Чтобы вывести данные клиенту, просто найдите объект ответа.
Скопируйте код кода следующим образом:
пакет com.yyz.response;
импортировать java.io.IOException;
импортировать java.io.OutputStream;
импортировать javax.servlet.ServletException;
импортировать javax.servlet.http.HttpServlet;
импортировать javax.servlet.http.HttpServletRequest;
импортировать javax.servlet.http.HttpServletResponse;
//Проблема с выводом китайского языка
публичный класс ResponseDemo расширяет HttpServlet {
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
Строковые данные = «Китай»;
OutputStream out = response.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); Этот код включает двойную проверку таблицы кодов.
* Когда «Китай» изменяется с символьных данных на байтовые данные, будет использоваться таблица кодов gb2312.
* Когда данные отправляются в браузер для отображения, необходимо еще раз просмотреть таблицу кодов. Таблица кодов, используемая в данный момент, связана с настройками браузера.
*/
}
public void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
doGet (запрос, ответ);
}
}
Результаты теста, когда в браузере установлена кодировка GB2312:
Результаты теста, когда в браузере установлена кодировка UTF-8:
Чтобы сделать наш веб-сайт доступным для иностранных пользователей, когда мы преобразуем символьные данные в байтовые данные, мы должны указать таблицу кодов преобразования как UTF-8. Но в это время, если браузер будет открыт с помощью GB2312, искаженные символы снова появятся. Хотя эту проблему с искаженным кодом можно решить путем изменения настроек браузера, это не способствует улучшению пользовательского опыта. Поэтому нам нужно использовать программу, чтобы сообщить браузеру, к какой таблице кодов обращаться для отображения данных.
Скопируйте код кода следующим образом:
пакет com.yyz.response;
импортировать java.io.IOException;
импортировать java.io.OutputStream;
импортировать javax.servlet.ServletException;
импортировать javax.servlet.http.HttpServlet;
импортировать javax.servlet.http.HttpServletRequest;
импортировать javax.servlet.http.HttpServletResponse;
//Проблема с выводом китайского языка
публичный класс ResponseDemo расширяет HttpServlet {
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
//На стороне сервера, из какой кодовой таблицы выводятся данные, тогда и необходимо контролировать, с какой кодовой таблицей открывается браузер.
Строковые данные = «Китай»;
response.setHeader("тип контента", "text/html;charset=UTF-8");
OutputStream out = response.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
public void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
doGet (запрос, ответ);
}
}
Узнайте еще один трюк:
Используйте тег <meta> на языке HTML для управления поведением браузера.
<meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
http-equiv имитирует заголовок ответа HTTP и сообщает браузеру открыть его в кодовой таблице UTF-8. Реальные заголовки ответов имеют приоритет над заголовками ответов, смоделированными с помощью http-equiv.
В реальной разработке сервер должен использовать потоки символов для записи текстовых данных в браузер. Однако кодовая таблица потока символов по умолчанию, полученная с помощью метода ответа getWriter, — ISO8859-1. В этой кодовой таблице нет соответствующей китайской кодировки, поэтому она будет изменена? Соответствующая кодировка отправляется в браузер, и когда браузер открывается, он полон вопросительных знаков. Таблицу кодов, к которой обращается сервер при отправке данных, можно изменить с помощью setCharacterEncoding ответа.
Скопируйте код кода следующим образом:
пакет com.yyz.response;
импортировать java.io.IOException;
импортировать java.io.PrintWriter;
импортировать javax.servlet.ServletException;
импортировать javax.servlet.http.HttpServlet;
импортировать javax.servlet.http.HttpServletRequest;
импортировать javax.servlet.http.HttpServletResponse;
//Проблема с выводом китайского языка
публичный класс ResponseDemo расширяет HttpServlet {
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
//На стороне сервера, из какой кодовой таблицы выводятся данные, тогда и необходимо контролировать, с какой кодовой таблицей открывается браузер.
Строковые данные = «Китай»;
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.write(данные);
}
public void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
doGet (запрос, ответ);
}
}
Здесь следует отметить несколько небольших деталей:
1. response.setCharacterEncoding("UTF-8"); необходимо написать перед PrintWriter out = response.getWriter();. Бесполезно устанавливать кодировку после получения потока символов.
2. response.setHeader("content-type", "text/html;charset=UTF-8"); Существует более простой способ написания response.setContentType("text/html;charset=UTF-8");.
3.response.setContentType("text/html;charset=UTF-8"); Фактически этот код имеет две функции: уведомление о выводе ответа в UTF-8 и открытие браузера в UTF-8. Это эквивалентно response.setHeader("content-type", "text/html;charset=UTF-8"); и response.setCharacterEncoding("UTF-8");.
4. Из вышеизложенного читатели смогут понять, почему вывод response.getOutputStream.write(1) в браузере не равен 1; Поскольку браузер является текстовым редактором, после получения данных ему потребуется 1, чтобы найти таблицу кодов, а затем отобразить соответствующие символы. Если вы хотите выводить числа в браузере, вам следует преобразовать числа в строки, response.getOutputStream.write((1+"").getBytes());.
Используйте OutputStream (поток байтов) для отправки данных:
1. response.getOutputStream().write("China".getBytes());//Отправляем данные в кодировке по умолчанию
2. response.getOutputStream().write("China".getBytes("UTF-8"));//Отправляем данные в кодировке UTF-8, браузер (по умолчанию GB2312) будет отображаться искаженным
Решение:
2.1 Изменяя метод кодировки браузера: IE/"Вид"/"Кодировка"/"UTF-8" (не желательно)
2.2 Сообщите клиенту метод кодирования, установив заголовок ответа: response.setHeader("Content-type", "text/html;charset=UTF-8");//Сообщите браузеру тип данных и кодировку
2.3 Имитация заголовков запросов с помощью метатегов: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 С помощью следующего метода: response.setContentType("text/html;charset=UTF-8");