Conversión de código de ucs2 a gbk
Vi que muchos amigos tienen problemas con la codificación Unicode de caracteres chinos. Qué "tabla de correspondencia de caracteres chinos Unicode" se necesita...
Siempre quise responder a la publicación, pero está demasiado ocupado (incluso preguntar en el foro lo que necesito).
De hecho, la conversión de código de caracteres chinos es muy sencilla. Creo que c++ también debería tener las funciones correspondientes. Espero que estos códigos sean útiles para los amigos que usan Java.
/*
* UnicodeTest.java
*
*Creado el 29 de julio de 2003 a las 12:59 p.m.
*/
/**
*
* @autor abc
* @versión
*/
Clase pública UnicodeTest
{
Pública estática vacía principal(String args[])
{
prueba Unicode UT = nueva prueba Unicode();
ut prueba 1();
}
Prueba de anulación pública1()
{
Cadena str = "Información de prueba ABC 123";
Probar
{
byte[ ]b = str . getbytes(" GBK ");
System.out.println(str+"-(GBK)code:"+bytesToHexStr(b));
system out . println(" ");
str = nueva cadena (b, "GBK");
System.out.println("Codificado desde GBK"+bytesToHexStr(b)+" retraducido a cadena: "+str);
system . out . println(" ");
b = str . getbytes(" unicode big unmarked ");
System.out.println(str+"-(UCS2)code:"+bytesToHexStr(b));
system out . = new string(b, "unicode big unmarked");
system out . println(" codificado desde(UCS 2)"+bytesToHexStr(b)+"reconvertir a cadena: "+str);
sistema. fuera . println(" ");
b = getbytes(" ASCII ");
out.println (str+"-(ascii)code:"+bytesToHexStr(b));
sistema out . p>catch(Exception e){}
}
Cadena privada bytesToHexStr(byte[] b)
{
if ( b == null) devuelve " ";
búfer de cadena strBuffer = nuevo búfer de cadena(b . longitud * 3); )
{
strbuffer . append(integer . tohexstring(b & amp; 0x ff));
strbuffer(" "); p>
}
Devuelve strbuffer . tostring();
}
}
Ejecuta este pequeño programa. El resultado es :
Información de prueba abc123 - Código (GBK): b2e 2 CAD 4 d0c 5 CF A2 61 62 63 31 32 33.
Convertir del código GBK b2e 2 CAD 4 D5CF a 2 61 62 63 31 32 33 a cadena: información de prueba abc123.
Información de la prueba abc123 - Código (UCS2): 6 d4b 8 BD 54 e 16060638+0062063031032033.
Reconvertido de codificación (UCS2) 6D4B 8bd 54e 1606 f 061062063031032033 a cadena: información de prueba abc123.
Información de la prueba abc123 - Código (ASCII): 3f3f6f61 62 63 31 32 33.
He estado trabajando en el programa de puerta de enlace SP de China Unicom durante este período. Originalmente trabajaba en aplicaciones web y estaba familiarizado con la programación Java, como las bases de datos. Nunca he estado expuesto al diseño y programación de sistemas de puertas de enlace SMS. Durante este proceso, se encontraron varios problemas espinosos y la transcodificación UCS2 fue uno de ellos.
Al principio, el negocio de nuestra empresa no involucraba información china, por lo que no prestamos atención a este tema. Los usuarios sólo necesitan enviar letras y números, pero en los últimos días encontré algunos caracteres confusos en la base de datos, Messagecoding=8. Supongo que puede estar relacionado con el método de entrada del teléfono móvil del usuario. Incluso los números arábigos son de doble byte, como "8" y "8".
El siguiente código es la API subyacente:
......(Leer bytes de la entrada)
//Obtener el código del mensaje
codificación del mensaje = bytes del cuerpo[44];
//Obtener la longitud del contenido del mensaje de texto
Comando SGIP. BytesCopy(bodybytes, abyte0, 45, 48, 0);
Longitud del mensaje = comando SGIP. bytes 4 toint(abyte 0);
//Crear bytes de longitud de contenido.
MessageByte = nuevo byte [longitud del mensaje];
//Copiar mensaje copiar bytes del mensaje.
Comando SGIP. BytesCopy(bodybytes, MessageByte, 49, (49 + MessageLength) - 1, 0);
//Iniciar la conversión de decodificación
If(MessageCoding==8){//If codificar Si el formato es UCS2, se convertirá a una cadena normal.
Pruebe {
MessageContent = new String(MessageByte, "unicode big unmarked");
} catch(UnsupportedEncodingException e){
}
}De lo contrario{
MessageContent = nueva cadena (byte de mensaje);
}
De hecho, en Java, usted solo se necesita un contenido del mensaje = nueva cadena (byte del mensaje, "unicode bignmarked"); se puede convertir y guardar en la base de datos, para que no se confunda.
Después de la conversión, también utilicé otra función para convertir todos los dígitos árabes codificados en GBK (como "8") a dígitos ASCII. Esto es útil para la lógica empresarial.
Otra cosa a tener en cuenta es que GB2312 es una versión anterior del formato de codificación chino, GBK es un nuevo formato de codificación chino, GBK es un superconjunto de GB2312 y GB2312 es un subconjunto verdadero de GBK.
Mi API subyacente es la API subyacente de Insk, pero he modificado varias imperfecciones en la API de Insk. Espero que ayude a algunos compañeros que tienen el mismo problema que yo.