2011-01-17 74 views
5

Tengo un escenario en el que algunos caracteres especiales se almacenan en una base de datos (sybase) en la codificación predeterminada del sistema y tengo que buscar estos datos y enviarlos a un tercero con codificación UTF-8 usando un Programa Javacodificación Java UTF8

Condición previa que los datos enviados a un tercero no deben exceder un tamaño máximo definido. Desde la conversión a UTF-8 un personaje puede ser reemplazado por 2 o 3 caracteres, entonces mi lógica dicta que después de obtener los datos de la base de datos debo codificarlos en la cadena UTF-8 y luego dividir la cadena. Las siguientes son mis observaciones:

Cuando aparece cualquier carácter especial como caracteres chinos o griegos o cualquier carácter especial> ASCII 256 y cuando lo convierto en UTF-8, un solo carácter puede estar representado por más de 1 byte.

Entonces, ¿cómo puedo estar seguro de que la conversión es correcta? Para la conversión estoy usando el siguiente

// storing the data from database into string 
string s = getdata from the database; 

// converting all the data in byte array utf8 encoding 
byte [] b = s.getBytes("UTF-8"); 

// creating a new string as my split logic is based on the string format 

String newString = new String(b,"UTF-8"); 

Pero cuando la producción de este newString a la consola consigo ? de los caracteres especiales.

así que tengo algunas dudas:

  • Si mi lógica de conversión es malo, entonces ¿Cómo podría corregirlo.
  • Después de hacer mi conversión a UTF-8, ¿puedo verificar si mi conversión es correcta o no? Quiero decir que es el mensaje correcto que debe enviarse a un tercero, supongo que si el mensaje no es legible por el usuario después de la conversión, entonces hay algún problema con la conversión.

Me gustaría tener algunos puntos de vista de todos los expertos.

Háganme saber si se necesita más información de mi parte.

+3

Eso parece ser un problema con su consola, en lugar de la conversión, que hasta donde yo sé, está bien. ¿Has intentado escribirlo en un archivo de texto en lugar de hacerlo en la consola y abrirlo con un editor de texto? – biziclop

+1

ha intentado sacar la cadena original? Es posible que la fuente utilizada por su consola no contenga estos caracteres – josefx

+0

La tarea de convertir de unicode a utf-8 y hacer que los caracteres se muestren correctamente no está exenta de problemas. Un contacto encontró una solución el año pasado. Le preguntaré cómo logró que esto funcione. –

Respuesta

0

Las cadenas Java son unicode, pero no todos los componentes java admiten cadenas Unicode completas, especialmente componentes AWT y componentes de oscilación ligera. Por lo tanto, puede tener cadenas perfectamente buenas, pero obtener basura en la salida de la consola.

0

gracias a todos por sus respuestas ..

según lo sugerido por algunos de ustedes, que ya intentaron escribir en un archivo de texto, sin embargo en el archivo de texto también me queda? para mis personajes especiales Así que tengo las siguientes observaciones:

a) La codificación es un proceso doble, primero cambie la cadena de una codificación a otra codificación en el nivel de bytes y luego también debe tener la fuente requerida para el nuevo juego de caracteres .

b) Si estamos codificando una cadena que significa que estamos codificando los bytes, para el escenario actual, estoy usando las comillas dobles de la palabra MS y luego insertando en una base de datos sybase, y luego de obtener los datos de db , lo estoy escribiendo en un archivo txt, donde estoy obteniendo lo mismo? para comillas dobles, sin embargo, si copio directamente las mismas cosas del DB a la palabra MS o edito más, puedo ver los caracteres reales. entonces no soy capaz de comprender este problema Según mi comprensión, durante la codificación deberíamos preocuparnos únicamente por el valor del byte que son las representaciones reales y no el objeto de cadena que constituimos a partir de estos arreglos de bytes. Sin embargo, a menos que mi información codificada no sea legible, ¿cómo puede el otro validar? y lo leyó (supongo que estos leerían bytes, pero si para un personaje especial, ¿alguno?como el carácter basura ha sido introducido mientras que la codificación utf8, entonces no es una pérdida de información).

Realmente agradecería sus puntos de vista sobre mis observaciones y ¿qué enfoque correcto debo seguir?

+1

el? solo le digo que el programa que está usando para ver su texto también es infeliz. No puedes decir lo que realmente está pasando hasta que veas los bits. Use una herramienta hexdump para ver texto de ejemplo. – ddyer

2

Dice que está escribiendo Unicode en un archivo de texto, pero que requiere una conversión desde Unicode.

¿Pero una conversión a qué? Eso depende de cómo abra el archivo.

Por ejemplo, System.out.println(myUnicodeString) convertirá el Unicode a la codificación con la que se creó System.out, probablemente la codificación predeterminada de su plataforma. Si está ejecutando Windows, es probable que sea windows-1252.

Si le dice a Java para que utilice codificación UTF-8 cuando se escribe en un archivo, obtendrá un archivo que contiene UTF-8:

PrintWriter pw = new PrintWriter(new FileOutputStream("filename.txt"), "UTF-8"); 
pw.println(myUnicodeString); 
0

uso de este converstion adecuada - éste es de iso-8859-1 a UTF-8:

public String to_utf8(String fieldvalue) throws UnsupportedEncodingException{ 

     String fieldvalue_utf8 = new String(fieldvalue.getBytes("ISO-8859-1"), "UTF-8"); 
     return fieldvalue_utf8; 
}