2012-10-04 77 views
22

Tengo una página JSP cuya codificación de página es ISO-8859-1. Esta página JSP está en un blog de preguntas y respuestas. Quiero incluir caracteres especiales durante la publicación de preguntas y respuestas.Codificación UTF-8 en la página JSP

El problema es que JSP no admite la codificación UTF-8, incluso la he cambiado de ISO-8859-1 a UTF-8. Estos caracteres (~, %, &, +) están causando problemas. Cuando estoy publicando estos caracteres de forma individual o con la combinación de cualquier carácter, es storinh null en la base de datos y cuando elimino estos caracteres al publicar la aplicación, funciona correctamente.

¿Alguien puede sugerir alguna solución?

+0

espectáculo como el código que recibe los datos, cómo lo almacenas a db, cómo lo cambias de db a jsp – MaVRoSCy

+0

Es un código muy largo que no puedo pegar aquí, pero puedo decirte el flujo. El usuario está publicando la respuesta para una pregunta de una página jsp (a.jsp). Estoy tomando todo el valor de un archivo tester.js (en el envío), luego estos valores van a la página oculta de jsp, entonces estoy llamando al método java para publicar los datos. Si un usuario está publicando (&&&&&&&), el valor viene hasta el archivo tester.js, pero después de enviar el valor a la página jsp oculta, todos los valores se vuelven nulos (solo en el caso anterior, el descanso especial de caracteres funciona bien). – Shailendra

+0

publique el método tester.js que maneja el envío – MaVRoSCy

Respuesta

4

Usted tiene que asegurarse de que el archivo se guardan sido con codificación UTF-8. Puede hacerlo con varios editores de texto sin formato. Con Notepad ++, es decir, puede elegir en el menú Encoding ->Encode in UTF-8. También puede hacerlo incluso con el Bloc de notas de Windows (Save As -> Codificación UTF-8). Si está utilizando Eclipse, puede configurarlo en Propiedades del archivo.

Además, compruebe si el problema es que tiene que escapar esos caracteres. No sería extraño que fuera tu problema, ya que uno de los personajes es &.

48

Se debe utilizar la misma codificación en todas las capas de su aplicación para evitar este problema. Es útil añadir un filter para definir la codificación:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
throws ServletException 
{ 
    request.setCharacterEncoding("UTF-8"); 
    chain.doFilter(request, response); 
} 

Para única establecer la codificación de las páginas JSP, añada esta línea a ellos:

<%@ page contentType="text/html; charset=UTF-8" %> 

Configure su base de datos para utilizar el mismo Char codificación también.

Si es necesario convertir la codificación de una cadena de ver:

que no lo recomendaría para almacenar texto codificado HTML en su base de datos. Por ejemplo, si necesita generar un PDF (o cualquier otro que no sea HTML), primero debe convertir la codificación HTML.

+0

¿Puede explicar un poco más ya que soy nuevo en este problema. como dónde agregar el filtro. – Shailendra

+0

Para obtener información detallada y un ejemplo, consulte http://stackoverflow.com/tags/servlet-filters/info –

3

Esto es un problema común.

una de las formas más fáciles de resolver es comprobar si el carácter especial está llegando dentro de la capa de acción y luego modificar el carácter especial en el código java.

Si usted es capaz de ver a este personaje en acción o cualquier otra capa de java de su elección (como capa de negocio), basta con sustituir el carácter con el carácter correspondiente HTML usando el StringEscapeUtils.html#escapeHtml

Después de hacer el escape. use la nueva cadena para guardar en la base de datos.

+0

y recibí su solución, pero no puedo obtener el carácter especial en la capa empresarial. Se está perdiendo en el jsp antes de llegar a la clase java. – Shailendra

+0

@ShailendraDubey hmmm la fecha debería haber estado en forma y llegó a la capa de acción ¿puede verificarlo? si no viene, puede poner algunos detalles del código o algún código de muestra (sin incluir el JSP completo). –

24

La etiqueta completa JSP debe ser algo como esto, la mente la pageEncoding también:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

Algunos navegadores antiguos estropear con la codificación también. puede utilizar la etiqueta HTML

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

también el archivo debe ser grabado en formato UTF-8, si está utilizando Eclipse Haga clic izquierdo en el Archivo-> Propiedades-> Salida -> Archivo de texto de codificación.

+1

"" es suficiente. – Timo

+0

No en todos los casos. Ex. si su proyecto no es UTF-8 por defecto. [doc aquí] (http://docs.oracle.com/cd/B14099_19/web.1012/b14014/jspnls.htm#i1005593) – PbxMan

+1

Ese pageEncoding lo hizo por mí. La metaetiqueta sola no. – Thomas

4

Este hilo puede ayudarle a: Passing request parameters as UTF-8 encoded strings

Básicamente:

request.setCharacterEncoding("UTF-8"); 
String login = request.getParameter("login"); 
String password = request.getParameter("password"); 

O usar javascript en archivos JSP:

var userInput = $("#myInput").val();    
var encodedUserInput = encodeURIComponent(userInput); 
$("#hiddenImput").val(encodedUserInput); 

y después de recuperarse de la clase:

String parameter = URLDecoder.decode(request.getParameter("hiddenImput"), "UTF-8"); 
+0

Además, he agregado el parámetro _URIEncoding = "UTF-8" _ en la etiqueta _ _ de server.xml (en mi caso, estoy usando Apache Tomcat) – dellasavia

+0

Esta solución está bien, pero podría agregar una configuración global en la web. xml agregando un CharacterEncodingFilter, simplemente siga este enlace [https://stackoverflow.com/a/30276333](https://stackoverflow.com/a/30276333) –

10

También tuve un problema al mostrar charectors como "Ṁ Ů". Agregué lo siguiente a mi web.xml.

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>*.jsp</url-pattern> 
     <page-encoding>UTF-8</page-encoding> 
    </jsp-property-group> 
</jsp-config> 

Esto resolvió el problema en las páginas, excepto en el encabezado. Intenté muchas formas de resolver esto y nada funcionó en mi caso. El problema con el encabezado era que el encabezado de la página jsp se incluye desde otro jsp. Así que le di la codificación a la importación y eso resolvió mi problema.

<c:import url="/Header1.jsp" charEncoding="UTF-8"/> 

Gracias

+0

Gracias por esta sugerencia. Esto también fue necesario y parece evitar escribir la <% @ página pageEncoding = "UTF-8"%> en cada archivo jsp (el único problema fue que este cambio solo tuvo efecto después de dos reinicios de Tomcat y Browser- Caché y no directamente ...) – leole

0

que tenían el mismo problema al utilizar caracteres especiales como delimitadores de JSP. Cuando los personajes especiales se publicaron en el servlet, todos se equivocaron. He resuelto el problema mediante la siguiente conversión:

String str = new String (request.getParameter("string").getBytes ("iso-8859-1"), "UTF-8"); 
0

i añadir a shell script para convertir los archivos JSP de 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 
3

Solía ​​filtro de codificación que ha resuelto mi problema de toda la codificación ...

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 
     } 

    } 

en 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> 
0

Gracias por todas las sugerencias. Usando Tomcat8 también agregué un filtro como escribió @Jasper de Vries. Pero en los Tomcats más nuevos, hoy en día, ya se implementó un filtro que se puede usar o simplemente sin comentar en la web de Tomcat.xml:

<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> 

Y como todos los demás publicados; Agregué el URIEncoding="UTF-8" al Tomcat Connector en Apache. Eso también ayudó.

importante decir, que Eclipse (si se utiliza este) tiene una copia de su web.xml y sobrescribe los Tomcat-Configuración como se explicó aquí: Broken UTF-8 URI Encoding in JSPs

Cuestiones relacionadas