Кодировка UTF-8 на странице JSP
У меня есть страница JSP
, страница которой ISO-8859-1
. Эта страница JSP находится в блоге ответа на вопрос. Я хочу включать специальные символы во время проводки Q/A.
Проблема заключается в том, что JSP не поддерживает кодировку UTF-8
, даже я изменил ее с ISO-8859-1
на UTF-8
. Эти символы (~
, %
, &
, +
) создают проблему. Когда я отправляю этот символ либо по отдельности, либо с комбинацией любого символа, он хранит null
в базе данных, и когда я удаляю эти символы во время публикации приложения, он работает нормально.
Может ли кто-нибудь предложить какое-то решение?
Ответы
Ответ 1
Вы должны использовать одну и ту же кодировку на всех уровнях вашего приложения, чтобы избежать этой проблемы. Полезно добавить фильтр для установки кодировки:
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
Чтобы установить кодировку только на ваших страницах JSP, добавьте к ним следующую строку:
<%@ page contentType="text/html; charset=UTF-8" %>
Сконфигурируйте свою базу данных, чтобы использовать ту же кодировку символов.
Если вам нужно преобразовать кодировку строки, смотрите:
Я бы не рекомендовал хранить кодированный HTML-код в вашей базе данных. Например, если вам нужно сгенерировать PDF (или что-то другое, кроме HTML), вам нужно сначала преобразовать кодировку HTML.
Ответ 2
Полный JSP-тег должен быть чем-то вроде этого, также обратите внимание на pageEncoding:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Некоторые старые браузеры тоже испортили кодировку. вы можете использовать тег HTML
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Также файл должен быть записан в формате UTF-8, если вы используете Eclipse левой кнопкой мыши по файлу- > Свойства- > Исключить → Текстовое кодирование файла.
Ответ 3
У меня также возникла проблема с отображением charectors типа "Ṁ Ů". Я добавил следующее в свой web.xml.
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
Это решило проблему на страницах, кроме заголовка. Пробовал много способов решить это, и в моем случае ничего не работало. Проблема с заголовком была связана с заголовком jsp-страницы из другого jsp. Так что дала кодировку для импорта, и это решило мою проблему.
<c:import url="/Header1.jsp" charEncoding="UTF-8"/>
Спасибо
Ответ 4
Вы должны убедиться, что файл был сохранен с кодировкой UTF-8.
Вы можете сделать это с помощью нескольких текстовых редакторов. С Notepad ++, т.е. Вы можете выбрать в меню Encoding
→ Encode in UTF-8
. Вы также можете сделать это даже с помощью "Блокнота Windows" (Save As
→ Encoding UTF-8).
Если вы используете Eclipse, вы можете установить его в файле Properties.
Также проверьте, есть ли проблема в том, что вы должны вывести эти символы. Не было бы странно, что это была ваша проблема, так как один из символов - &
.
Ответ 5
Этот поток может помочь вам:
Передача параметров запроса в кодированные строки UTF-8
В принципе:
request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
Или вы используете javascript в файле jsp:
var userInput = $("#myInput").val();
var encodedUserInput = encodeURIComponent(userInput);
$("#hiddenImput").val(encodedUserInput);
и после восстановления по классу:
String parameter = URLDecoder.decode(request.getParameter("hiddenImput"), "UTF-8");
Ответ 6
Я использовал фильтр кодирования, который решил мою проблему с кодировкой...
package com.dina.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
* @author DINANATH
*/
public class EncodingFilter implements Filter {
private String encoding = "utf-8";
public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
// response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
String encodingParam = filterConfig.getInitParameter("encoding");
if (encodingParam != null) {
encoding = encodingParam;
}
}
public void destroy() {
// nothing todo
}
}
в web.xml
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>
com.dina.filter.EncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Ответ 7
Это общая проблема.
Один из самых простых способов решить - проверить, достигает ли специальный символ внутри слоя действия, а затем изменить специальный символ в коде Java.
Если вы можете просмотреть этот символ в Action или любом другом Java-слое по вашему выбору (например, бизнес-уровень), просто замените этот символ соответствующим HTML-символом, используя StringEscapeUtils.html # escapeHtml.
Сделав побег. используйте новую строку для сохранения в БД.
Ответ 8
Это специальные символы в html. Почему вы не кодируете его?
Проверьте это: http://www.degraeve.com/reference/specialcharacters.php
Ответ 9
Это поможет вам.
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
Ответ 10
У меня была та же проблема с использованием специальных символов в качестве разделителей на JSP. Когда специальные символы были отправлены на сервлет, все они перепутались. Я решил проблему, используя следующее преобразование:
String str = new String (request.getParameter("string").getBytes ("iso-8859-1"), "UTF-8");
Ответ 11
i добавьте эту оболочку script для преобразования файлов jsp из IS
#!/bin/sh
###############################################
## this script file must be placed in the parent
## folder of the to folders "in" and "out"
## in contain the input jsp files
## out will containt the generated jsp files
##
###############################################
find in/ -name *.jsp |
while read line; do
outpath=`echo $line | sed -e 's/in/out/'` ;
parentdir=`echo $outpath | sed -e 's/[^\/]*\.jsp$//'` ;
mkdir -p $parentdir
echo $outpath ;
iconv -t UTF-8 -f ISO-8859-1 -o $outpath $line ;
done
Ответ 12
Спасибо за все подсказки. Используя Tomcat8, я также добавил фильтр, как писал @Jasper de Vries. Но в более новых Tomcats в настоящее время уже реализован фильтр, который можно использовать или просто комментировать в webcat.xml Tomcat:
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
...
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
И, как и все остальные опубликованные; Я добавил URIEncoding="UTF-8"
к соединителю Tomcat в Apache. Это также помогло.
Важно отметить, что Eclipse (если вы используете это) имеет копию своего web.xml и перезаписывает Tomcat-Settings, как было объяснено здесь: Сломанная кодировка URI UTF-8 в JSP
Ответ 13
Кодировка страницы или что-то еще не имеет большого значения. ISO-8859-1 является подмножеством UTF-8, поэтому вам никогда не придется преобразовывать ISO-8859-1 в UTF-8, потому что ISO-8859-1 уже является UTF-8, подмножеством UTF-8, но все же UTF- 8.
Плюс ко всему, все это ничего не значит, если у вас где-то есть двойная кодировка.
Это мой рецепт лечения всех вещей, связанных с кодировкой и кодировкой:
String myString = "heartbroken ð";
//Строка имеет двойное кодирование, сначала исправим.
myString = new String(myString.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
String cleanedText = StringEscapeUtils.unescapeJava(myString);
byte[] bytes = cleanedText.getBytes(StandardCharsets.UTF_8);
String text = new String(bytes, StandardCharsets.UTF_8);
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
decoder.onMalformedInput(CodingErrorAction.IGNORE);
decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
CharsetEncoder encoder = charset.newEncoder();
encoder.onMalformedInput(CodingErrorAction.IGNORE);
encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
try {
// The new ByteBuffer is ready to be read.
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(text));
// The new ByteBuffer is ready to be read.
CharBuffer cbuf = decoder.decode(bbuf);
String str = cbuf.toString();
} catch (CharacterCodingException e) {
logger.error("Error Message if you want to");
}