Solución al problema confuso de jsp
2009-07-15 10:32
1. La razón por la cual la página JSP está confusa es que la codificación del juego de caracteres no está especificada en la página. La solución: simplemente use el siguiente código al principio de la página para especificar la codificación del juego de caracteres, <%@ page contentType=. "texto /html; juego de caracteres=gb2312" %>
2. Caracteres confusos en la base de datos. Este tipo de caracteres confusos hará que los caracteres chinos que inserte en la base de datos se conviertan en caracteres confusos, o los caracteres chinos que inserte en la base de datos también serán caracteres confusos cuando se lean y se muestren. :
Agregue el juego de caracteres codificados a la cadena de conexión de la base de datos (lo mismo se aplica a las conexiones de origen de datos)
Cadena Url="jdbc:mysql://localhost/digitgulf?
usuario=root&contraseña=root&useUnicode=true&characterEncoding=GB2312";
Y use el siguiente código en la página:
respuesta.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3. Caracteres confusos al pasar chino como parámetro Cuando pasamos un carácter chino como parámetro a otra página, también aparecerán caracteres confusos.
Codifique parámetros al pasar parámetros, como RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
Luego utilice la siguiente declaración en la página de parámetros de recepción para recibir palabras clave=new String(request.getParameter("keywords").getBytes("8859_1"));
El problema central de los caracteres confusos sigue siendo el problema de la codificación del juego de caracteres. Siempre que se domine, se pueden resolver los problemas generales del código confuso.
------------------------------------------
Desde que entré en contacto con Java y JSP, he estado lidiando constantemente con el problema de los caracteres chinos confusos en Java. Ahora finalmente se ha resuelto por completo. Ahora compartiremos nuestra experiencia de solución con todos.
1. El origen del problema chino de Java.
Los archivos principales y de clase de Java se basan en Unicode, lo que hace que los programas Java sean buenos para varias plataformas, pero también trae algunos problemas con los caracteres chinos confusos. Hay dos razones principales: el problema del código confuso causado por la compilación de los propios archivos Java y JSP y el problema del código confuso causado por la interacción de los programas Java con otros medios.
En primer lugar, es probable que los archivos fuente de Java (incluido JSP) contengan chino, y el método de guardado de los archivos fuente de Java y JSP se basa en flujos de bytes. Si Java y JSP se compilan en archivos de clase, el método de codificación utilizado es diferente al de. el archivo fuente. Si la codificación es inconsistente, aparecerán caracteres confusos. En base a este tipo de código confuso, se recomienda no escribir chino en archivos Java (la parte del comentario no participa en la compilación, no importa si escribe chino, si debe escribir, intente compilar manualmente con el parámetro). -ecoding GBK o -ecoding gb2312 para JSP, en el encabezado del archivo Agregando <%@ page contentType="text/html;charset=GBK"%> o <%@ page contentType="text/html;charset=gb2312"%; > básicamente puede resolver este tipo de problema de código confuso.
Este artículo se centrará en el segundo tipo de código confuso, que es el código confuso que se genera cuando los programas Java interactúan con otros medios de almacenamiento. Muchos medios de almacenamiento, como bases de datos, archivos, secuencias, etc., se basan en secuencias de bytes. Cuando un programa Java interactúa con estos medios, se producirá la conversión entre caracteres (char) y bytes (byte), por ejemplo, desde una página. Los datos enviados en el formulario de envío muestran caracteres confusos en el programa Java.
Si el método de codificación utilizado en el proceso de conversión anterior no coincide con la codificación original de los bytes, es probable que aparezcan caracteres confusos.
2. Solución
Para el popular Tomcat, existen dos soluciones:
1) Cambie D:Tomcatconfserver.xml y especifique el formato de codificación del navegador como "chino simplificado":
El método consiste en encontrar el
<Puerto del conector="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirigirPort="8443" aceptarCount="100"
ConnectionTimeout="20000" enableUploadTimeout="true" URIEncoding='GBK' />
Etiquetas, texto en negrita agregado por mí.
Puede verificar si su cambio fue exitoso de esta manera: antes de realizar el cambio, en su navegador IE donde aparece la página confusa, haga clic en el menú "Ver | Codificación" y encontrará que "Europa Occidental (ISO)" está seleccionada. Después del cambio, haga clic en el menú "Ver | Codificación" y verá que está seleccionado "Chino simplificado (GB2312)".
b) Actualice el programa Java Mi programa es el siguiente:
la clase pública ThreeParams extiende HttpServlet {
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
respuesta.setContentType("texto/html; conjunto de caracteres=GBK");
...
}
}
Se requieren fuentes en negrita y su función es permitir que el navegador convierta caracteres Unicode en caracteres GBK. De esta manera, el contenido de la página y el modo de visualización del navegador se configuran en GBK, por lo que no habrá caracteres confusos.
Solución completa para chino bajo Tomcat.
Estoy desarrollando un proyecto estos días. El servidor es Tomcat, el sistema operativo es Artículos y opiniones, finalmente lo logré. Pero una buena memoria no es tan buena como una mala pluma, así que lo anoté para evitar olvidarlo y también para brindar una buena referencia a quienes encuentren el mismo problema:
(1) La página JSP está en chino, pero cuando la miras, está confusa:
La solución es utilizar <%@ page language="java" contentType="text/html;charset=GBK" %> en la codificación de la página JSP. Debido al problema de codificación cuando Jsp se convierte en un archivo Java, El valor predeterminado en algunos servidores es ISO-8859-1. Si se ingresa chino directamente en un JSP, definitivamente habrá un problema si Jsp lo trata como ISO8859-1. Podemos confirmar esto mirando el archivo intermedio de Java generado por Jasper.
(2) Cuando se utiliza el objeto Solicitud para obtener el código de caracteres chinos enviado por el cliente, aparecerán caracteres confusos:
La solución es configurar un filtro, que es un filtro Servelet. El código es el siguiente:
importar java.io.IOException;
importar javax.servlet.Filter;
importar javax.servlet.FilterChain;
importar javax.servlet.FilterConfig;
importar javax.servlet.ServletException;
importar javax.servlet.ServletRequest;
importar javax.servlet.ServletResponse;
la clase pública CharacterEncodingFilter implementa el filtro {
configuración privada de FilterConfig;
codificación de cadena privada = "ISO8859_1";
destrucción de vacío público () {
System.out.println(config);
configuración = nulo;
}
doFilter público vacío (solicitud ServletRequest, respuesta ServletResponse,
cadena FilterChain) arroja IOException, ServletException {
request.setCharacterEncoding(codificación);
//chain.doFilter(solicitud, respuesta);
chain.doFilter (solicitud, respuesta);
}
public void init (configuración de FilterConfig) lanza ServletException {
this.config = configuración;
String s = config.getInitParameter("codificación");
si (s! = nulo) {
codificación = s;
}
}
}
}
Configurar web.xml
<filtro>
<nombre-filtro>FiltroCodificaciónDeCaracteres</nombre-filtro>
<filtro-clase>com.SetCharacterEncodingFilter</filtro-clase>
</filtro>
<asignación de filtros>
<nombre-filtro>FiltroCodificaciónDeCaracteres</nombre-filtro>
<patrón-url>/*</patrón-url>
</filtro-mapeo>
Si esta situación aún ocurre en su caso, puede bajar y ver si tiene la cuarta situación si los datos enviados por su formulario se envían mediante get. En términos generales, no hay problema si usa post para enviar. , eche un vistazo a la cuarta solución.
También existe el procesamiento de información que contiene caracteres chinos. El código de procesamiento es:
paquetedbJavaBean;
Codificación de clase públicaConvertir
{
Codificación públicaConvertir()
{
//
}
cadena pública a Gb (cadena uniStr) {
Cadena gbStr = "";
si(uniStr == nulo){
uniStr = "";
}
intentar{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = nueva cadena(tempByte,"GB2312");
}
captura (excepción ex) {
}
devolver gbStr;
}
cadena pública aUni (cadena gbStr) {
Cadena uniStr = "";
si(gbStr == nulo){
gbStr = "";
}
intentar{
byte[] tempByte = gbStr.getBytes("GB2312");
uniStr = nueva cadena(tempByte,"ISO8859_1");
}catch(Excepción ex){
}
devolver unistr;
}
}
También puede realizar una conversión directa, primero codifique la cadena obtenida con ISO-8859-1, luego almacene la codificación en una matriz de bytes y luego convierta la matriz en un objeto de cadena.
String str=request.getParameter("niña");
Byte B[]=str.getBytes("ISO-8859-1");
Cadena = nueva cadena (B);
Mediante la conversión anterior, cualquier información enviada se puede mostrar correctamente.
(3) Cuando la solicitud Formget usa request.getParameter("name") en el servidor, se devuelven caracteres confusos; configurar el filtro de acuerdo con el método de Tomcat no funciona, o usar request.setCharacterEncoding("GBK"); El problema es que en términos del método de procesamiento de transferencia de parámetros: si usa el método doGet (solicitud HttpServletRequest, respuesta HttpServletResponse) en el servlet para procesarlo, incluso si está escrito antes:
request.setCharacterEncoding("GBK");
respuesta.setContentType("text/html;charset=GBK");
¡Tampoco funciona, el chino devuelto todavía está confuso! ! ! Si cambia esta función a doPost (solicitud HttpServletRequest, respuesta HttpServletResponse), todo estará bien.
De manera similar, cuando se usan dos páginas JSP para procesar la entrada del formulario, la razón por la que se puede mostrar el chino es porque se usa el método post para pasarlo y cambiarlo al método get aún no funciona.
Se puede ver que se debe prestar atención al utilizar el método doGet () en el servlet o el método get en JSP. Después de todo, esto implica pasar información de parámetros a través del navegador, lo que probablemente cause conflictos o discrepancias en los conjuntos de caracteres de uso común.
La solución es:
1) Abra el archivo server.xml de Tomcat, busque el bloque y agregue la siguiente línea:
Codificación URI = "GBK"
El completo debe ser el siguiente:
<Puerto del conector="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirigirPort="8443" AcceptCount="100" debug="0" ConnectionTimeout="20000" enableUploadTimeout=" verdadero" URIEncoding="GBK"/>
2) Reinicie Tomcat, todo está bien.
Puede descubrir el motivo por el que necesita unirse estudiando el archivo en $TOMCAT_HOME/webapps/tomcat-docs/config/http.html. Cabe señalar que si usa UTF-8 en este lugar, aparecerán caracteres confusos en Tomcat durante el proceso de transmisión. Si eso no funciona, cambie a otro conjunto de caracteres.
(4) Hay caracteres chinos en la página JSP y caracteres chinos en los botones, pero aparecen caracteres confusos al ver la página a través del servidor:
La solución es: primero, el texto del mensaje traducido no debe incluirse directamente en el archivo JSP, sino que debe obtenerse del paquete de recursos a través de la etiqueta <bean:message>. Debe colocar su texto chino en el archivo Application.properties. Este archivo se encuentra en WEB-INF/classes/*. Por ejemplo, si tengo dos etiquetas para nombre y edad en la página, primero necesito crear una aplicación. properties El contenido interno debe ser nombre="nombre" edad="edad", luego coloco este archivo en WEB-INF/classes/properties/ y luego lo codifico de acuerdo con el archivo Application.properties para crear un archivo de recursos chino. , asumiendo que el nombre es Application_cn.properties. El comando nativo2ascii se proporciona en el JDK, que puede realizar la conversión de codificación de caracteres. Busque el directorio donde colocó el archivo Application.properties en el entorno DOS Ejecute el comando en el entorno DOS. Se generará el archivo de recursos chino Application_cn.properties codificado en GBK: Native2ascii ?codificación gbk Application.properties Application_cn.properties. el comando anterior, en el futuro, se generará el archivo Application_cn.properties con el siguiente contenido: name=u59d3u540d age=u5e74u9f84, configurado en Struts-config.xml: <message-resourcesparameter="properties.Application_cn"/>. En este punto, básicamente está hecho más de la mitad. Luego debe escribir <%@ page language="java" contentType="text/html;charset=GBK" %> en la página JSP. es Escriba <bean:message key=”name”> Cuando este cambio aparezca en la página, aparecerá el nombre chino. Lo mismo ocurre con la edad. Los caracteres chinos en el botón también se procesan de la misma manera.
(5) El código escrito en la base de datos está confuso:
Solución: configure un filtro, que es un filtro Servelet. El código es el mismo que la segunda vez.
Si está conectado directamente a la base de datos a través de JDBC, el código de configuración es el siguiente: jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK Esto garantizará que el código de la base de datos no esté confuso.
Si vincula a través de la fuente de datos, lo anterior también es adecuado. Si lo configura correctamente, cuando ingrese chino, será chino en la base de datos. Una cosa a tener en cuenta es que también debe usar la página <%@. página que muestra los datos language="java" contentType="text/html;charset=GBK" %>Esta línea de código. Cabe señalar que algunos empleados de recepción usan Dreamver para escribir el código. Al escribir un formulario, lo cambian a un jsp. Hay una cosa a la que prestar atención, y es el método de envío de Action. solicitud, y debe enviarla, porque hay dos métodos de envío JSP: POST y GET, pero el código enviado por estos dos métodos sigue siendo muy diferente en términos de codificación. Esto se explica más adelante.
Resumen del artículo:
Aquí hablamos principalmente de la solución al problema confuso de jsp.
1. El problema más básico de los caracteres confusos.
PHPCE.CN, Manual de diseño
3. Cómo manejar caracteres confusos en el método de envío del formulario.
Si utiliza el método get para enviar chino, la página que acepta parámetros también aparecerá confusa. El motivo de este código confuso también se debe al formato de codificación interno de Tomcat iso8859-1. Tomcat codificará los caracteres chinos utilizando el método de codificación predeterminado get, iso8859-1, y los agregará a la URL después de la codificación, lo que dará como resultado parámetros confusos / y recibidos de la página.
Solución:
R. Utilice el primer método del ejemplo anterior para decodificar los caracteres recibidos y luego transcodificarlos.
B. Get utiliza el envío de URL y se realizó la codificación iso8859-1 antes de ingresar la URL. Para afectar esta codificación, debe agregar useBodyEncodingForURI="true" al nodo Conector en server.xml
La configuración de atributos puede controlar el método de codificación de caracteres chinos de Tomcat para el método get. El atributo anterior controla el envío de obtención que se codificará utilizando el formato de codificación establecido por request.setCharacterEncoding ("UTF-8"). Por lo tanto, se codifica automáticamente como utf-8 y la página de aceptación puede aceptarlo normalmente. Pero creo que el proceso de codificación real es que Tomcat tiene que cambiar D:Tomcatconfserver.xml y especificar el formato de codificación del navegador como "chino simplificado":
<Puerto del conector="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirigirPort="8443" aceptarCount="100"
debug="0" ConnectionTimeout="20000" useBodyEncodingForURI="true"
enableUploadTimeout="true" URIEncoding="UTF-8"/> PHPCE.CN, el URIEncoding="UTF-8" configurado en el manual de diseño está codificado nuevamente, pero como se codificó como utf-8, no se codificado de nuevo. Algo ha cambiado. Si la codificación se obtiene de la URL, la página receptora se decodifica según URIEncoding="UTF-8".
Puede saber el motivo por el que necesita agregarlo estudiando el archivo en $TOMCAT_HOME/webapps/tomcat-docs/config/http.html. Puede verificar si su cambio se realizó correctamente de esta manera: antes de realizar el cambio, aparece una página confusa. aparecerá en su página En el navegador IE, haga clic en el menú "Ver | Codificación" y encontrará que "Europa occidental (ISO)" está seleccionada. Después del cambio, haga clic en el menú "Ver | Codificación" y verá que está seleccionado "Chino simplificado (GB2312)".
4. Resuelva los caracteres confusos al cargar archivos. Al cargar archivos, la configuración del formulario es enctype="multipart/form-data". De esta manera los archivos se envían en forma de transmisión. Si utiliza el componente de carga de Apache, encontrará una gran cantidad de código confuso. Esto se debe a que el primer commons-fileupload.jar de Apache tiene un error y los caracteres chinos se eliminan y decodifican. Debido a que se envía este método, la codificación utiliza automáticamente el formato de codificación predeterminado de Tomcat iso-8859-1. Pero el problema de los caracteres confusos es que los símbolos especiales como puntos, comas, etc. se convierten en caracteres confusos. Si el número de caracteres chinos es impar, aparecerán caracteres confusos. Si hay un número par, el análisis será normal. .
Solución: descargue commons-fileupload-1.1.1.jar. Esta versión del jar ha solucionado estos errores.
Sin embargo, al extraer el contenido, aún deberá transcodificar los caracteres extraídos de iso8859-1 a utf-8. Se pueden obtener todos los caracteres y caracteres chinos normales.
5. Código Java con respecto a la solicitud de URL, que recibe parámetros confusos
El formato de codificación de la URL depende del URIEncoding="UTF-8" mencionado anteriormente. Si se establece este formato de codificación, significa que todos los parámetros de caracteres chinos de la URL deben estar codificados. De lo contrario, los valores de los parámetros de caracteres chinos obtenidos están todos confusos, como un enlace Response.sendDerect ("/a.jsp?name=Zhang Dawei" y se usa directamente en a.jsp);
PHPCE.CN, Manual de diseño
String name = request.getParameter("name"); lo que obtienes son caracteres confusos. Debido a que está estipulado que debe ser utf-8, la redirección debe escribirse así:
Response.sendDerect("/a.jsp?name=URLEncode.encode("Zhang Dawei","utf-8"); únicamente.
¿Qué pasará si este parámetro URIEncoding="UTF-8" no está configurado? Si no está configurado, se utilizará el formato de codificación predeterminado iso8859-1. El problema surge nuevamente. El primero es que si el número de valores del parámetro es un número impar, se puede analizar normalmente. Si es un número par, el carácter final será confuso. Además, si el último carácter está en inglés, se puede analizar normalmente, pero los signos de puntuación chinos siguen siendo confusos. Como solución, si no hay signos de puntuación chinos en sus parámetros, puede agregar un símbolo en inglés al final del valor del parámetro para resolver el problema confuso y luego eliminar el último símbolo después de obtener los parámetros. También se puede raspar o utilizar.
6. Con respecto a la solicitud de URL, el código del script también controlará la redirección de la página si los parámetros recibidos son confusos. También involucrará los parámetros adjuntos y analizará los parámetros en la página receptora. Si este parámetro de caracteres chinos no realiza el procesamiento de codificación especificado por URIEncoding="UTF-8", los caracteres chinos recibidos por la página receptora también serán confusos. El procesamiento y la codificación de scripts son problemáticos. Debe tener un archivo correspondiente al script de codificación y luego llamar al método en el script para codificar los caracteres chinos.
7. Con respecto al problema confuso del jsp abierto en MyEclipse. Para un proyecto existente, el formato de almacenamiento del archivo Jsp puede ser utf-8. Si eclipse se instala recientemente, el formato de codificación utilizado de forma predeterminada para abrir es iso8859-1. Por lo tanto, los caracteres chinos en jsp están confusos. Este código confuso es relativamente fácil de resolver. Simplemente vaya a las preferencias de eclipse3.1, busque general->edidor y configure la codificación de apertura de su archivo en utf-8. Eclipse se volverá a abrir automáticamente con el nuevo formato de codificación. Los caracteres chinos se pueden mostrar normalmente.
8. Acerca del código confuso al abrir una página HTML en eclipse Dado que la mayoría de las páginas son producidas por Dreamweaver, su formato de almacenamiento es diferente al reconocimiento de eclipse.
Generalmente, en este caso, cree un nuevo jsp en eclipse, copie el contenido de la página directamente desde dreamweaver y péguelo en el jsp.
PHPCE.CN, Manual de Diseño
Este problema de código confuso es el problema de código confuso más simple. Generalmente aparecerán nuevos. Es el código confuso causado por una codificación de página inconsistente.
<%@ idioma de página="java" pageEncoding="UTF-8"%>
<%@ página contentType="text/html;charset=iso8859-1"%>
<html>
<cabeza>
<title>Problema chino</title>
<meta http-equiv="Tipo de contenido" content="text/html; conjunto de caracteres=UTF-8">
</cabeza>
</cabeza>
<cuerpo>
soy una buena persona
</cuerpo>
</html>
Codificación en tres lugares.
El formato de codificación en primer lugar es el formato de almacenamiento del archivo jsp. Ecljpse guardará archivos de acuerdo con este formato de codificación. Y compile el archivo jsp, incluidos los caracteres chinos que contiene.
La segunda codificación es el formato de decodificación. Debido a que los archivos guardados como UTF-8 se decodifican en iso8859-1, si hay chino, definitivamente será confuso. Eso significa que debe ser consistente. No es necesario que la línea donde se encuentra el segundo lugar esté allí. El formato de codificación predeterminado también es ISO8859-1. Entonces, sin esta línea, "Soy una buena persona" también sería confuso. Debe ser consistente.
La tercera codificación es controlar el método de decodificación del navegador. Si las decodificaciones anteriores son consistentes y correctas, el formato de codificación no importa. Algunas páginas web aparecen confusas porque el navegador no puede determinar qué formato de codificación utilizar. Debido a que las páginas a veces están incrustadas en otras páginas, el navegador confunde el formato de codificación. Aparecen caracteres confusos. PHPCE.CN, Manual de diseño
2. El problema de los caracteres confusos recibidos después de enviar el formulario mediante el método de publicación también es un problema común. Este código confuso también se debe al formato de codificación interno de Tomcat iso8859-1, es decir, cuando se envía la publicación, si el formato de codificación enviado no está configurado, se enviará en el método iso8859-1, pero en el jsp aceptado. será aceptado en el método utf-8. resultando en caracteres confusos. Por este motivo, a continuación te presentamos varias soluciones y comparativas.
A. Conversión de codificación al aceptar parámetros
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8"); en este caso, cada parámetro debe transcodificarse de esta manera. Muy problemático. Pero sí puedes conseguir caracteres chinos.
B. Al comienzo de la página de solicitud, ejecute el código de codificación solicitado, request.setCharacterEncoding("UTF-8"), y establezca el juego de caracteres del contenido enviado en UTF-8. En este caso, no es necesario transcodificar las páginas que aceptan este parámetro. Usar directamente
String str = request.getParameter("something"); puede obtener los parámetros de los caracteres chinos. Pero esta frase debe ejecutarse en cada página. Este método solo es efectivo para envíos de publicaciones, pero no es válido para enctype="multipart/form-data" al enviar archivos y cargar archivos. Los dos caracteres confusos se explicarán por separado más adelante.
C. Para evitar escribir request.setCharacterEncoding("UTF-8") en cada página, se recomienda utilizar filtros para
Realizar procesamiento de codificación. Hay muchos ejemplos de esto en línea. Por favor compruébalo tú mismo