El siguiente artículo describirá y discutirá los problemas anteriores. Tomaremos la palabra "chino" como ejemplo. La búsqueda de información relevante muestra que la codificación GB2312 de "chino" es "d6d0 cec4" y la codificación Unicode es "4e2d 6587". la codificación UTF es "e4b8ad e69687". (Tenga en cuenta que las dos palabras "chino" no tienen codificación iso8859-1, pero pueden "representarse" mediante codificación iso8859-1).
1. Conocimientos básicos de codificación:
La codificación más antigua es iso8859-1, que es similar a la codificación ascii. Sin embargo, para facilitar la representación de varios idiomas, han surgido gradualmente muchas codificaciones estándar. Las más importantes son las siguientes:
1.iso8859-1
Es una codificación de un solo byte y el rango máximo de caracteres que se puede representar es 0-255. Se aplica a la serie en inglés. Por ejemplo, la codificación de la letra a es 0x61=97.
Obviamente, el rango de caracteres representado por la codificación iso8859-1 es muy estrecho y no puede representar caracteres chinos. Sin embargo, dado que es una codificación de un solo byte y es consistente con la unidad de representación más básica de la computadora, la codificación iso8859-1 todavía se usa en muchos casos. Y en muchos protocolos, esta codificación se utiliza de forma predeterminada. Por ejemplo, aunque la palabra "chino" no existe en la codificación iso8859-1, tomando como ejemplo la codificación gb2312, deben ser dos caracteres de "d6d0 cec4". Cuando se utiliza la codificación iso8859-1, se dividirá en 4 bytes. Representa: "d6 d0 ce c4" (de hecho, al almacenar, también se procesa en bytes). Y si es codificación UTF, son 6 bytes "e4 b8 ad e6 96 87". Obviamente, esta representación debe basarse en otra codificación.
2.GB2312/GBK
Este es el código estándar nacional de Hanzi, que se utiliza especialmente para representar caracteres chinos. Es una codificación de doble byte y las letras en inglés son consistentes con iso8859-1 (compatible con la codificación iso8859-1). Entre ellos, la codificación gbk se puede utilizar para representar caracteres chinos tradicionales y simplificados al mismo tiempo, mientras que gb2312 solo puede representar caracteres simplificados. gbk es compatible con la codificación gb2312.
3.unicode
Esta es la codificación más unificada que se puede utilizar para representar caracteres en todos los idiomas, y es una codificación de doble byte (también de cuatro bytes) de longitud fija, que incluye letras en inglés. Por lo que se puede decir que no es compatible con la codificación iso8859-1, ni es compatible con ninguna codificación. Sin embargo, en comparación con la codificación iso8859-1, la codificación uniocode solo agrega un byte 0 delante, por ejemplo, la letra a es "00 61".
Cabe señalar que la codificación de longitud fija es fácil de procesar para las computadoras (tenga en cuenta que GB2312/GBK no es una codificación de longitud fija) y Unicode se puede usar para representar todos los caracteres, por lo que la codificación Unicode se usa internamente en muchos software. como por ejemplo java.
4.UTF
Teniendo en cuenta que la codificación Unicode no es compatible con la codificación iso8859-1 y fácilmente ocupa más espacio: porque para las letras en inglés, Unicode también requiere dos bytes para representar. Por tanto, Unicode no es conveniente para la transmisión y el almacenamiento. Por lo tanto, se produjo la codificación UTF. La codificación UTF es compatible con la codificación ISO8859-1 y también se puede utilizar para representar caracteres en todos los idiomas. Sin embargo, la codificación UTF es una codificación de longitud variable y la longitud de cada carácter varía de 1 a 6. bytes. Además, la codificación UTF viene con una función de verificación sencilla. En términos generales, las letras inglesas se representan con un byte, mientras que los caracteres chinos utilizan tres bytes.
Tenga en cuenta que aunque se utiliza UTF para utilizar menos espacio, solo se compara con la codificación Unicode. Si ya sabe que se trata de caracteres chinos, usar GB2312/GBK es sin duda la más económica. Pero, por otro lado, vale la pena señalar que, aunque la codificación UTF utiliza 3 bytes para los caracteres chinos, incluso para las páginas web con caracteres chinos, la codificación UTF ahorrará más que la codificación Unicode, porque la página web contiene muchos caracteres en inglés.
2. Procesamiento de caracteres en Java
Al escribir aplicaciones Java, habrá muchos lugares que involucran la codificación del juego de caracteres, algunos lugares requieren una configuración correcta y otros lugares requieren un cierto grado de procesamiento.
1.getBytes(juego de caracteres)
Esta es una función estándar para el procesamiento de cadenas de Java. Su función es codificar los caracteres representados por la cadena según el conjunto de caracteres y representarlos en bytes. Tenga en cuenta que las cadenas siempre se almacenan en la memoria de Java en codificación Unicode. Por ejemplo, "chino" se almacena como "4e2d 6587" en circunstancias normales (es decir, cuando no hay ningún error). Si el juego de caracteres es "gbk", se codifica como "d6d0 cec4" y luego los bytes "d6". d0 ce c4" se devuelven. Si el juego de caracteres es "utf8", el final es "e4 b8 ad e6 96 87". Si es "iso8859-1", porque no se puede codificar, finalmente se devuelve "3f 3f" (Nota: "3f 3f" son dos signos de interrogación).
2. nueva cadena (juego de caracteres)
Esta es otra función estándar para el procesamiento de cadenas de Java. Es lo opuesto a la función anterior. Combina e identifica la matriz de bytes según la codificación del juego de caracteres y finalmente la convierte a Unicode para su almacenamiento. Con referencia al ejemplo anterior de getBytes, tanto "gbk" como "utf8" pueden producir el resultado correcto "4e2d 6587", pero iso8859-1 finalmente se convierte en "003f 003f" (dos signos de interrogación).
Debido a que utf8 se puede usar para representar/codificar todos los caracteres, new String( str.getBytes( "utf8") , "utf8" ) === str, que es completamente reversible.
3. establecerCodificación de caracteres()
Esta función se utiliza para configurar solicitudes http o la codificación correspondiente.
Para solicitudes, se refiere a la codificación del contenido enviado. Después de especificar, puede obtener directamente la cadena correcta a través de getParameter (). Si no se especifica, la codificación iso8859-1 se usa de forma predeterminada, lo que requiere procesamiento adicional. Consulte "Entrada de formulario" a continuación. Vale la pena señalar que no se puede ejecutar getParameter() antes de ejecutar setCharacterEncoding(). El documento de Java indica: Este método debe llamarse antes de leer los parámetros de solicitud o leer la entrada usando getReader().