Решение проблемы с искажением jsp
2009-07-15 10:32
1. Причина искажения страницы JSP заключается в том, что на странице не указана кодировка набора символов. Решение: просто используйте следующий код в начале страницы, чтобы указать кодировку набора символов: <%@ page contentType=. "текст /html; набор символов=gb2312" %>
2. Искаженные символы в базе данных. Из-за такого рода искаженных символов китайские символы, которые вы вставляете в базу данных, становятся искаженными, или китайские символы, которые вы вставляете в базу данных, также будут искаженными при чтении и отображении. Решение заключается в следующем. :
Добавьте закодированный набор символов в строку подключения к базе данных (то же самое относится и к подключениям к источникам данных)
String Url="jdbc:mysql://localhost/digitgulf?
user=root&password=root&useUnicode=true&characterEncoding=GB2312";
И используйте следующий код на странице:
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3. Искаженные символы при передаче китайского символа в качестве параметра. Когда мы передаем китайский иероглиф в качестве параметра на другую страницу, искаженные символы также отображаются. Решение следующее:
Кодируйте параметры при передаче параметров, например RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
Затем используйте следующий оператор на странице параметров приема, чтобы получить ключевые слова=новая строка(request.getParameter("keywords").getBytes("8859_1"));
Основной проблемой искаженных символов по-прежнему остается проблема кодирования набора символов. Пока эта проблема решена, общие проблемы искаженного кода могут быть решены.
------------------------------------------
С тех пор, как я познакомился с Java и JSP, я постоянно сталкивался с проблемой искажения китайских символов в Java. Теперь она наконец-то полностью решена. Теперь мы поделимся своим опытом решения со всеми.
1. Происхождение китайской проблемы Java
Ядро Java и файлы классов основаны на юникоде, что делает программы Java хорошей кроссплатформенностью, но также создает некоторые проблемы с искаженными китайскими символами. Есть две основные причины: проблема искаженного кода, вызванная компиляцией самих файлов Java и JSP, и проблема искаженного кода, вызванная взаимодействием программ Java с другими носителями.
Прежде всего, исходные файлы Java (включая JSP), скорее всего, будут содержать китайский язык, а метод сохранения исходных файлов Java и JSP основан на потоках байтов. Если Java и JSP скомпилированы в файлы классов, используемый метод кодирования отличается от . исходный файл несовместим, символы будут искажены. Из-за такого рода искаженного кода рекомендуется не писать в файлах Java на китайском языке (часть комментариев не участвует в компиляции, не имеет значения, пишете ли вы на китайском языке. Если вам необходимо написать, попробуйте вручную скомпилировать с параметром). -ecoding GBK или -ecoding gb2312 для JSP в заголовке файла. Добавление <%@ page contentType="text/html;charset=GBK"%> или <%@ page contentType="text/html;charset=gb2312"% > может в принципе решить проблему с искаженным кодом.
В этой статье основное внимание будет уделено второму типу искаженного кода, который представляет собой искаженный код, генерируемый при взаимодействии программ Java с другими носителями информации. Многие носители данных, такие как базы данных, файлы, потоки и т. д., основаны на потоках байтов. Когда программа Java взаимодействует с этими носителями, происходит преобразование между символами (char) и байтами (byte), например, со страницы. Данные, представленные в форме отправки, отображают искаженные символы в программе Java.
Если метод кодирования, используемый в описанном выше процессе преобразования, несовместим с исходной кодировкой байтов, могут появиться искаженные символы.
2. Решение
Для популярного Tomcat есть два решения:
1) Измените D:Tomcatconfserver.xml и укажите формат кодировки браузера как «Упрощенный китайский»:
Метод заключается в том, чтобы найти
<Порт соединителя="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
EnableLookups="false" redirectPort="8443" AcceptCount="100"
ConnectionTimeout="20000" DisableUploadTimeout="true" URIEncoding='GBK' />
Теги, жирный текст добавлены мной.
Вы можете проверить успешность вашего изменения следующим образом: прежде чем вносить изменения, в браузере IE, где появляется искаженная страница, щелкните меню «Вид | Кодировка», и вы обнаружите, что выбрано «Западная Европа (ISO)». После изменения щелкните меню «Вид | Кодировка» и вы обнаружите, что выбран «Упрощенный китайский (GB2312)».
б) Обновите программу Java. Моя программа выглядит следующим образом:
публичный класс ThreeParams расширяет HttpServlet {
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
response.setContentType("text/html; charset=GBK");
...
}
}
Требуются жирные шрифты, и их функция состоит в том, чтобы позволить браузеру преобразовывать символы Юникода в символы GBK. Таким образом, содержимое страницы и режим отображения браузера устанавливаются на GBK, поэтому искаженных символов не будет.
Полное решение китайского языка под tomcat
Сейчас я разрабатываю проект. Сервер — Tomcat, операционная система — Статьи и мнения, наконец-то все получилось. Но хорошая память не так хороша, как плохая ручка, поэтому я записал ее, чтобы не забыть, а также дать хороший справочник тем, кто столкнется с той же проблемой:
(1) Страница JSP на китайском языке, но при просмотре она искажается:
Решение состоит в том, чтобы использовать <%@ page Language="java" contentType="text/html;charset=GBK" %> в кодировке страницы JSP. Из-за проблемы с кодировкой при преобразовании Jsp в файл Java с помощью по умолчанию на некоторых серверах это ISO-8859-1. Если китайский язык вводится непосредственно в JSP, определенно возникнет проблема с тем, что Jsp обрабатывает его как ISO8859-1. Мы можем подтвердить это, посмотрев на промежуточный файл Java, созданный Jasper.
(2) При использовании объекта Request для получения кода китайского символа, предоставленного клиентом, будут отображаться искаженные символы:
Решение состоит в том, чтобы настроить фильтр, который является фильтром сервлета. Код выглядит следующим образом:
импортировать java.io.IOException;
импортировать javax.servlet.Filter;
импортировать javax.servlet.FilterChain;
импортировать javax.servlet.FilterConfig;
импортировать javax.servlet.ServletException;
импортировать javax.servlet.ServletRequest;
импортировать javax.servlet.ServletResponse;
публичный класс CharacterEncodingFilter реализует Filter {
частная конфигурация FilterConfig;
частная строковая кодировка = «ISO8859_1»;
общественный недействительный уничтожить () {
System.out.println(конфигурация);
конфигурация = ноль;
}
public void doFilter (запрос ServletRequest, ответ ServletResponse,
Цепочка FilterChain) выдает IOException, ServletException {
request.setCharacterEncoding(кодировка);
//chain.doFilter(запрос, ответ);
Chain.doFilter(запрос, ответ);
}
public void init (конфигурация FilterConfig) выдает ServletException {
this.config = конфигурация;
String s = config.getInitParameter("кодирование");
если (s != ноль) {
кодировка = с;
}
}
}
}
Настроить веб.xml
<фильтр>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.SetCharacterEncodingFilter</filter-class>
</фильтр>
<сопоставление фильтра>
<filter-name>CharacterEncodingFilter</filter-name>
<url-шаблон>/*</url-шаблон>
</фильтр-маппинг>
Если эта ситуация по-прежнему возникает в вашем случае, вы можете пойти вниз и посмотреть, есть ли у вас четвертая ситуация. Передаются ли данные, отправленные вашей формой, с помощью get. Вообще говоря, нет проблем, если вы используете post для отправки. , взгляните на четвертое решение.
Также существует обработка информации, содержащей китайские иероглифы. Код обработки:
упакованныйbJavaBean;
открытый класс CodingConvert
{
общедоступное CodingConvert()
{
//
}
общественная строка toGb (String uniStr) {
Строка gbStr = "";
если (uniStr == ноль) {
uniStr = "";
}
пытаться{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = новая строка (tempByte, «GB2312»);
}
catch(Исключение ex){
}
вернуть gbStr;
}
общественная строка toUni (String gbStr) {
Строка uniStr = "";
если (gbStr == ноль) {
gbStr = "";
}
пытаться{
byte[] tempByte = gbStr.getBytes("GB2312");
uniStr = новая строка (tempByte, «ISO8859_1»);
}catch(Исключение ex){
}
вернуть uniStr;
}
}
Вы также можете выполнить прямое преобразование. Сначала закодируйте полученную строку с помощью ISO-8859-1, затем сохраните кодировку в массиве байтов, а затем преобразуйте массив в строковый объект. Например:
String str=request.getParameter("девушка");
Байт B[]=str.getBytes("ISO-8859-1");
Str = новая строка (B);
Благодаря вышеуказанному преобразованию любая предоставленная информация может отображаться правильно.
(3) Когда запрос Formget использует request.getParameter("name") на сервере, возвращаются искаженные символы; установка фильтра в соответствии с методом tomcat не работает или использование request.setCharacterEncoding("GBK"); Либо проблема в том, что с точки зрения метода обработки передачи параметров: если вы используете метод doGet(запрос HttpServletRequest, ответ HttpServletResponse) в сервлете для его обработки, даже если он написан ранее:
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
Тоже не работает, китайцы вернули все равно искажено! ! ! Если вы измените эту функцию на doPost (запрос HttpServletRequest, ответ HttpServletResponse), все будет в порядке.
Аналогично, при использовании двух JSP-страниц для обработки ввода формы причина, по которой может отображаться китайский язык, заключается в том, что для его передачи используется метод post, а замена его на метод get по-прежнему не работает.
Видно, что вам нужно быть внимательным при использовании метода doGet() в сервлете или метода get в JSP. В конце концов, это предполагает передачу информации о параметрах через браузер, что может вызвать конфликты или несоответствия в часто используемых наборах символов.
Решение:
1) Откройте файл server.xml tomcat, найдите блок и добавьте следующую строку:
URIEncoding="GBK"
Полное должно быть следующим:
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" EnableLookups="false" redirectPort="8443" AcceptCount="100" debug="0" ConnectionTimeout="20000" DisableUploadTimeout=" true" URIEncoding="GBK"/>
2) Перезапускаем tomcat, все ок.
Вы можете узнать причину, по которой вам необходимо присоединиться, изучив файл $TOMCAT_HOME/webapps/tomcat-docs/config/http.html. Следует отметить, что если вы используете в этом месте UTF-8, во время процесса передачи в Tomcat будут отображаться искаженные символы. Если это не сработает, измените набор символов на другой.
(4) На странице JSP и на кнопках есть китайские иероглифы, но при просмотре страницы через сервер символы появляются искаженно:
Решение: во-первых, локализованный текст сообщения не должен включаться непосредственно в файл JSP, а должен быть получен из пакета ресурсов через тег <bean:message>. Вам следует поместить текст на китайском языке в файл Application.properties. Этот файл находится в папке WEB-INF/classes/*. Например, если на странице есть две метки для имени и возраста, мне сначала нужно создать приложение. Properties. Содержимое внутри должно быть name="name" age="age", затем я помещаю этот файл в WEB-INF/classes/properties/, а затем кодирую его в соответствии с файлом Application.properties, чтобы создать файл ресурсов на китайском языке. , предполагая, что имя — Application_cn.properties. Команда Native2ascii предусмотрена в JDK и может реализовать преобразование кодировки символов. Найдите каталог, в котором вы поместили файл Application.properties, в среде DOS. Будет создан китайский файл ресурсов Application_cn.properties, закодированный в GBK: own2ascii ?encoding gbk Application.properties Application_cn.properties. приведенная выше команда. В дальнейшем будет создан файл Application_cn.properties со следующим содержимым: name=u59d3u540d age=u5e74u9f84, настроенный в Struts-config.xml: <message-resources параметр="properties.Application_cn"/>. На данный момент более половины уже сделано. Затем вам нужно написать <%@ page Language="java" contentType="text/html;charset=GBK" %> на странице JSP. — это Write <bean:message key="name">. Когда это изменение появится на странице, появится китайское имя. То же самое касается возраста. Китайские символы на кнопке также обрабатываются таким же образом.
(5) Код, записанный в базу данных, искажен:
Решение: Настройте фильтр, который является фильтром сервлета. Код тот же, что и во второй раз.
Если вы подключены к базе данных напрямую через JDBC, код конфигурации будет следующим: jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK. Это гарантирует, что код в базе данных не будет искажен.
Если вы устанавливаете ссылку через источник данных, приведенное выше также подходит. Если вы правильно настроите его, при вводе китайского языка в базе данных будет китайский язык. Следует отметить, что вам также необходимо использовать страницу <%@. страница, отображающая данные. Language="java" contentType="text/html;charset=GBK" %>Эта строка кода. Следует отметить, что некоторые сотрудники стойки регистрации используют Dreamver для написания кода. При написании формы они меняют его на jsp. Есть одна вещь, на которую следует обратить внимание, — это представление действия в Dreamver. запрос, и вам нужно его отправить, потому что существует два метода отправки JSP: POST и GET, но код, отправленный этими двумя методами, по-прежнему сильно отличается с точки зрения кодировки. Это объясняется позже.
Краткое содержание статьи:
Здесь мы в основном говорим о решении проблемы искажения jsp
1. Основная проблема искаженных символов.
PHPCE.CN, Руководство по проектированию
3. Как обрабатывать искаженные символы в методе отправки формы.
Если вы используете метод get для отправки китайского языка, страница, которая принимает параметры, также будет отображаться искаженной. Причиной этого искаженного кода также является внутренний формат кодировки tomcat iso8859-1. Tomcat будет кодировать китайские символы, используя метод кодирования get по умолчанию, iso8859-1, и добавит его к URL-адресу после кодирования, что приведет к искажению параметров / и полученных со страницы.
Решение:
А. Используйте первый метод в приведенном выше примере, чтобы декодировать полученные символы, а затем перекодировать их.
Б. Get использует отправку URL-адреса, и перед вводом URL-адреса было выполнено кодирование iso8859-1. Чтобы повлиять на эту кодировку, вам необходимо добавить useBodyEncodingForURI="true" в узел Connector в файле server.xml.
Конфигурация атрибута может управлять методом кодирования китайских символов tomcat для метода get. Вышеупомянутый атрибут управляет отправкой get, которая будет закодирована с использованием формата кодировки, установленного request.setCharacterEncoding("UTF-8"). Поэтому он автоматически кодируется как utf-8, и страница приема может его нормально принять. Но я думаю, что реальный процесс кодирования заключается в том, что tomcat должен изменить D:Tomcatconfserver.xml и указать формат кодирования браузера как «Упрощенный китайский»:
<Порт разъема="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
EnableLookups="false" redirectPort="8443" AcceptCount="100"
debug="0" ConnectionTimeout="20000" useBodyEncodingForURI="true"
отключитьUploadTimeout="true" URIEncoding="UTF-8"/> PHPCE.CN, URIEncoding="UTF-8", установленный в руководстве по проектированию, закодирован снова, но, поскольку он был закодирован как utf-8, он не будет снова закодировано. Что-то изменилось. Если кодировка получена из URL-адреса, принимающая страница декодируется в соответствии с URIEncoding="UTF-8".
Вы можете узнать причину, по которой вам нужно его добавить, изучив файл $TOMCAT_HOME/webapps/tomcat-docs/config/http.html. Вы можете проверить, успешно ли ваше изменение, следующим образом: перед внесением изменения отображается искаженная страница. появится на вашей странице. В браузере IE щелкните меню «Вид | Кодировка» и вы обнаружите, что выбрано «Западная Европа (ISO)». После изменения щелкните меню «Вид | Кодировка» и вы обнаружите, что выбран «Упрощенный китайский (GB2312)».
4. Устраните искаженные символы при загрузке файлов. При загрузке файлов используются настройки формы enctype="multipart/form-data". Таким образом, файлы передаются в потоковом режиме. Если вы используете компонент загрузки Apache, вы обнаружите много искаженного кода. Это связано с тем, что в раннем файле commons-fileupload.jar apach есть ошибка, и китайские символы удаляются и декодируются. Поскольку этот метод отправлен, кодировка автоматически использует формат кодировки tomcat по умолчанию iso-8859-1. Но проблема с искаженными символами заключается в следующем: специальные символы, такие как точки, запятые и т. д., становятся искаженными. Если число китайских иероглифов нечетное, искаженные символы появятся. Если число четное, синтаксический анализ будет нормальным. .
Решение: Загрузите commons-fileupload-1.1.1.jar. В этой версии jar устранены эти ошибки.
Однако при извлечении содержимого вам все равно необходимо перекодировать извлеченные символы из iso8859-1 в utf-8. Все обычные китайские иероглифы и иероглифы можно получить.
5. Java-код запроса URL-адреса, получение искаженных параметров.
Формат кодирования URL-адреса зависит от URIEncoding="UTF-8", упомянутого выше. Если установлен этот формат кодировки, это означает, что все параметры китайских символов в URL-адресе должны быть закодированы. В противном случае все полученные значения параметров китайских символов будут искажены, например, ссылка Response.sendDerect ("/a.jsp?name=Zhang Dawei" и используется непосредственно в a.jsp);
PHPCE.CN, Руководство по проектированию
String name = request.getParameter("name"); вы получаете искаженные символы. Потому что оговорено, что это должен быть utf-8, поэтому перенаправление должно быть написано так:
Response.sendDerect("/a.jsp?name=URLEncode.encode("Чжан Давэй","utf-8"); только.
Что произойдет, если этот параметр URIEncoding="UTF-8" не установлен? Если он не установлен, будет использоваться формат кодировки по умолчанию iso8859-1. Проблема возникает снова. Во-первых, если количество значений параметра нечетное, его можно нормально разобрать. Если же это четное число, то конечный символ будет искажен. Кроме того, если последний символ написан на английском языке, его можно нормально проанализировать, но китайские знаки препинания все равно будут искажены. В качестве целесообразного решения, если в ваших параметрах нет китайских знаков препинания, вы можете добавить английский символ в конце значения параметра, чтобы решить проблему искажения, а затем удалить последний символ после получения параметров. Также можно поцарапать или использовать.
6. Что касается запроса URL-адреса, код сценария также будет контролировать перенаправление страницы, если полученные параметры искажены. Он также будет задействовать прикрепленные параметры и анализировать параметры на принимающей странице. Если этот параметр китайских символов не выполняет обработку кодирования, указанную URIEncoding="UTF-8", китайские символы, полученные принимающей страницей, также будут искажены. Обработка и кодирование сценария затруднительны. Необходимо иметь соответствующий файл, соответствующий сценарию кодирования, а затем вызывать метод сценария для кодирования китайских иероглифов.
7. Что касается проблемы с искажением jsp, открытого в MyEclipse. Для существующего проекта формат хранения файла Jsp может быть utf-8. Если eclipse установлен недавно, по умолчанию для открытия используется формат кодировки iso8859-1. Поэтому китайские иероглифы в jsp искажаются. Этот искаженный код относительно легко решить. Просто зайдите в настройки eclipse3.1, найдите General->edidor и установите открывающую кодировку вашего файла на utf-8. Eclipse автоматически откроется с новым форматом кодировки. Китайские иероглифы могут отображаться нормально.
8. Об искаженном коде при открытии HTML-страницы в eclipse. Поскольку большинство страниц создаются Dreamweaver, формат их хранения отличается от распознавания eclipse.
Обычно в этом случае создайте новый jsp в eclipse, скопируйте содержимое страницы непосредственно из Dreamweaver и вставьте его в jsp.
PHPCE.CN, Руководство по проектированию
Эта проблема с искаженным кодом — самая простая проблема с искаженным кодом. Обычно появляются новые. Это искаженный код, вызванный несогласованной кодировкой страницы.
<%@ page Language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<голова>
<title>Китайская проблема</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</голова>
</голова>
<тело>
я хороший человек
</тело>
</html>
Кодирование в трех местах.
Формат кодирования в первую очередь — это формат хранения файла jsp. Ecljpse сохранит файлы в соответствии с этим форматом кодировки. И скомпилируйте файл jsp, включая китайские иероглифы внутри.
Вторая кодировка — это формат декодирования. Поскольку файлы, сохраненные в формате UTF-8, декодируются в iso8859-1, если есть китайский язык, он обязательно будет искажен. Это означает, что оно должно быть последовательным. Линия, где находится второе место, не обязательно должна быть там. Формат кодировки по умолчанию также ISO8859-1. Поэтому без этой строчки фраза «Я хороший человек» также была бы искажена. Оно должно быть последовательным.
Третья кодировка предназначена для управления методом декодирования браузера. Если предыдущие декодирования последовательны и правильны, формат кодирования не имеет значения. Некоторые веб-страницы отображаются искаженными, поскольку браузер не может определить, какой формат кодировки использовать. Поскольку страницы иногда встраиваются в страницы, браузер путает формат кодировки. Появляются искаженные символы. PHPCE.CN, Руководство по проектированию
2. Проблема искаженных символов, полученных после отправки формы с использованием метода Post, также является распространенной проблемой. Этот искаженный код также вызван внутренним форматом кодировки tomcat iso8859-1. То есть, когда сообщение отправляется, если отправленный формат кодировки не установлен, он будет отправлен в методе iso8859-1, но будет принят jsp. будет принят в методе utf-8. что приводит к искажению символов. По этой причине вот несколько решений и сравнений.
A. Преобразование кодировки при приеме параметров
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8"); В этом случае каждый параметр необходимо перекодировать таким образом. Очень хлопотно. Но вы действительно можете получить китайские иероглифы.
Б. В начале страницы запроса выполните запрошенный код кодировки request.setCharacterEncoding("UTF-8") и установите набор символов отправляемого контента в UTF-8. В этом случае страницы, принимающие этот параметр, перекодировать не нужно. Используйте напрямую
String str = request.getParameter("something"); вы можете получить параметры китайских символов. Но это предложение должно быть исполнено на каждой странице. Этот метод эффективен только для отправки сообщений, но недействителен для enctype="multipart/form-data" при отправке и загрузке файлов. Два искаженных символа будут объяснены отдельно позже.
C. Чтобы не писать request.setCharacterEncoding("UTF-8") на каждой странице, рекомендуется использовать фильтры для
Выполните обработку кодирования. В Интернете есть много примеров этого. Пожалуйста, проверьте это сами