Подтвердить что ты не робот

Кодировка UTF-8 на странице JSP

У меня есть страница JSP, страница которой ISO-8859-1. Эта страница JSP находится в блоге ответа на вопрос. Я хочу включать специальные символы во время проводки Q/A.

Проблема заключается в том, что JSP не поддерживает кодировку UTF-8, даже я изменил ее с ISO-8859-1 на UTF-8. Эти символы (~, %, &, +) создают проблему. Когда я отправляю этот символ либо по отдельности, либо с комбинацией любого символа, он хранит null в базе данных, и когда я удаляю эти символы во время публикации приложения, он работает нормально.

Может ли кто-нибудь предложить какое-то решение?

4b9b3361

Ответ 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 ++, т.е. Вы можете выбрать в меню EncodingEncode 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.

Сделав побег. используйте новую строку для сохранения в БД.

Ответ 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");

                }