Red de conocimiento informático - Problemas con los teléfonos móviles - Conversión de código de ucs2 a gbk

Conversión de código de ucs2 a gbk

Problemas con la conversión de diferentes codificaciones de caracteres chinos

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(" ");

}

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.