¿Qué debo hacer si los caracteres chinos en el formulario de solicitud aparecen confusos al crear una página JSP?
Software y entorno: Windows XP (2000), j2sdk1.4.2, Tom*at 5.0.25, mysql 4.1, EMS Mysql Manager 2 (tablas fáciles de crear, versión 2.8.5.1), controlador mysql - *onne*tor-java-3.1.4-beta-bin.jar.
Objetivo: en este entorno, realizar la visualización, lectura e inserción normales de chino en la base de datos.
Nota: el autor solo probó en este entorno. Otros sistemas y versiones diferentes no se han probado.
Nota: conjunto de caracteres unificado (codificación de página JSP, conjunto de caracteres de base de datos MySQL). conectarse a la URL de la base de datos, solicitar configuración, etc.)
A continuación se utiliza GBK como ejemplo para explicar al autor. Si desea utilizar utf-8, simplemente cámbielo a utf-8 en el GBK correspondiente
--------------------- -- ---- Paso 1 Utilice el juego de caracteres GBK para crear bases de datos y tablas--------------------------------- -- --
Utilizo EMS para construir bases de datos y tablas mysql porque es una interfaz gráfica y fácil de operar (al igual que Enterprise Manager en SQL SERVER 2000).
Para crear una base de datos, seleccione *rear base de datos... en el menú EMS. Cree una nueva base de datos, Chara*terSet seleccione gbk_bin (otro gbk_*hinese_* No sé cuál es la diferencia y no puedo encontrarlo cuando busco información. Si lo sabe, dímelo y lo agregaré. aquí). No confunda el ícono con un signo más en la barra de herramientas que se parece a la base de datos con una nueva base de datos. La nueva base de datos registra una base de datos existente.
Cuando cree tablas en el futuro, seleccione el mismo conjunto de caracteres.
Una vez creado, no utilice EMS para insertar datos en él en este momento; de lo contrario, el chino que verá seguirá siendo confuso.
-------------------------- Paso 2 Agregue algunos parámetros después de la URL para conectarse a la base de datos---- --------------------------
Suponiendo que mi nueva base de datos es testdb, entonces la URL para conectarme a la base de datos debería ser:
jdb*:mysql://lo*alhost:3306/testdb?useUni*ode=true&*hara*terEn*coding=gbk
En este momento, tenga en cuenta : Si tuviera que escribir esta URL en código JAVA, la escribiría así. Pero si está en un archivo de configuración xml (como struts-*onfig.xml, web.xml, etc.), debe cambiar & a &; de lo contrario, se producirá un error.
Eso es
jdb*:mysql://lo*alhost:3306/testdb?useUni*ode=true&*hara*terEn*oding=gbk
------ -------------------- Paso 3 Cada página JSP debe declarar el juego de caracteres chinos ------------------ - ---------
Agregue una oración en la parte superior de cada página JSP
<%@ page language="java" *ontentType="text/html ; *harset=GBK " %>
Esto garantiza que los caracteres chinos se muestren correctamente en la página JSP
---------------- - ---------- Paso 4 Agregue una clase de filtro para establecer el juego de caracteres solicitado al pasar parámetros ----------------------- -
Debido a que los caracteres en la red se pasan a la clase de filtro, no se usan en la página JSP. Dado que los caracteres en la red se transmiten con codificación iso-8859-1, debemos restablecer el conjunto de caracteres solicitado para mostrar el chino correctamente. Si usamos una clase de filtro para hacer esto, no tenemos que restablecerla cada vez que obtenemos los parámetros chinos.
Contenido de la clase de filtro:
/*
* ===================== = ================================================
*
*
* Proyecto de código abierto JavaWebStudio
*
* Struts_db v0.1
*
* ======================================== =============================
*/
pa*kage *om .strutsLogin.util;
importar java.io.IOEx*eption;
importar javax.servlet.Filter
importar javax.ServletResponse; >
/**
* Filtro chino
*/
publi* *lass SetChara*terEn* odingFilter implementa el filtro {
//---------------------------------------------- -- -------- Variables instantáneas
/**
* La codificación *hara*ter predeterminada establecida para las solicitudes que pasan este filtro.
*/
prote*ted String en*oding = null
/**
* Somos asociado El objeto de configuración del filtro. Si este valor está vacío, este filtro no está configurado actualmente.
*/
prote*ted FilterConfig filterConfig = null
/**
* *hara*ter especificado por el cliente; ¿Debería ignorarse la codificación?
*/
prote*ted booleano ignorar = verdadero
// --------------- -- -----------------------------------Métodos Publi*
/** p>
* Desactiva este filtro.
*/
publi* void destroy() {
this.en*oding = null
this.filterConfig = null; ;
}
/**
* Seleccione y establezca (si se especifica) el *hara utilizado para interpretar los parámetros de solicitud para esta solicitud. *ter codificación.
*
* @param request La solicitud de servlet que estamos procesando
* @param result La respuesta de servlet que estamos creando
* @param *hain el filtro con el que estamos tratando *hain
*
* @ex*eption IOEx*eption si se produce un error de entrada/salida
* @ex*eption ServletEx*eption si se produce un error de servlet
*/
publi* void doFilter(solicitud de ServletRequest, respuesta de ServletResponse,
FilterChain *hain)
Genera IOEx*eption, ServletEx*eption {
// Selecciona y configura condicionalmente la codificación *hara*ter que se utilizará
p>if (ignorar || (request.getChara*terEn*oding() == null)) {
String en*oding = sele*tEn*oding(request); >
p>
if (en*oding ! = null)
request.setChara*terEn*oding(en*oding);
/ / Pasar *ontrol al siguiente filtro
*hain.doFilter(solicitud, respuesta
// Pasar *ontrol al siguiente filtro
<); p>*hain.response);}
/**
* Pone en uso este filtro.
*
*
* @param filterConfig objeto de configuración del filtro
*/
publi* void init (FilterConfig filterConfig) lanza ServletEx*eption {
this.filterConfig = filterConfig
this.en* oding = filterConfig.getInitParameter()
Valor de cadena = filterConfig.getInitParameter("ignorar");
if (valor == nulo)
this.ignore = true
else if ( value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
esto. ignorar = verdadero;
else
this.ignore = false
}
// ------- - --------------------------------------- ------- Métodos protegidos p>
/**
* Selecciona el
* *hara*teristi*s apropiado para usar según la solicitud actual y/o el
* *hara*teristi*s en los parámetros de inicialización del filtro. Devuelve
* <*ode>null*ode > si no se debe establecer la codificación *hara*ter en*oding.
*
* La implementación predeterminada devuelve incondicionalmente los parámetros de inicialización en*oding configurados por este
* valor de filtro .
*
* @param request La solicitud de servlet que estamos procesando
*/
*/
prote*ted String sele*tEn*oding(solicitud ServletRequest) {
return (this.en*oding
}
}
} //EOC
Este código proviene de www!
Luego agregamos algunas configuraciones en web.xml para comenzar. La configuración es la siguiente:
<. param-name>en*oding
<.init-param>
colocado en la ubicación adecuada en web.xml. ubicación apropiada en xml. Generalmente al final, antes de la etiqueta Después de los pasos anteriores, la visualización e inserción en chino en JSP y mysql será normal. También es normal en STRUTS. Sin embargo, si usa la consola de línea de comandos de EMS o mysql para ver los datos en la tabla, encontrará que son normales. ¿Qué diablos está pasando? No te preocupes, siempre que ejecutemos la siguiente línea de comando, ¡podremos ver chino normal! SET *hara*ter_set_*lient = gbk; SET *hara*ter_set_*onne*tion = gbk SET *hara*ter_set_database = gbk; SET *hara*ter _set_results = gbk; SET *hara*ter_set_server = gbk SET *ollation_*onne*tion = gbk_bin; /p> SET *ollation_database = gbk_bin; SET *ollation_server = gbk_bin Si está utilizando la línea de comando mysql, simplemente escriba. Si está utilizando EMS, hay un botón Mostrar editor SQL en la barra de herramientas, haga clic en él, escriba el comando anterior, luego presione el botón "exe*ute", ¡y listo! ¡En este caso, incluso puedes usar nombres chinos para crear bases de datos, nombres de tablas y nombres de campos! ------------------------------------------- ----- --------------------------------------------- ----- ------- ¡Pero hay una cosa a la que prestar especial atención! En mysql y JAVA existen diferentes reglas para nombres como GBK, UTF-8, etc., por lo que debes tener cuidado al escribir estos nombres, de lo contrario se producirán errores. Por ejemplo, GBK debería escribirse como GBK en JAVA, pero en mysql debería escribirse como gbk (la URL que conecta a la base de datos) Por ejemplo, UTF-8 debería escribirse como UTF- en JAVA 8, pero debería escribirse como utf8 en Mysql Otros caracteres del conjunto de caracteres tienen diferencias similares