Linux - Java y codificacion de Linux

   
Vista:

Java y codificacion de Linux

Publicado por Luigikhan (3 intervenciones) el 16/06/2009 05:44:51
Buen día mi problema es el siguiente:

Tengo una aplicación java J2SE que envia un String mediante un socket, dicho string contiene caracteres en ascii del 0 al 255 codificados en windows cp1252, esto debido a que java codifica del -127 al 127 y los valores de 128 a 255 quedan fuera, y , usando el charset de windows cp1252 este problema queda solucionado.

Dicha aplicación ha sido probada en windows y codifica perfectamente el string.

El problema radica en que al ejecutar dicho codigo en Debian Linux usando netbeans 6.5.1 y jdk 1.6 el string de salida me lo codifica en UTF-8 que es el standar de Linux, y no importa que charset use en mi proyecto el string es codificado en UTF-8. Por ejemplo si el string es "5F 2A 84" en su valor hexadecimal al codificarlo en caracter es _*ä Y es esa secuencia de 3 caracteres los que envio en el string. Pero al codificar Linux en UTF-8 los valores que se reciben en hexadecimal son : 5F 2A E2 80 92 y los valores en ascii son _*ÔÇÆ Obvio no es lo que es espera.

Habiendome documentado vi que se puede cambiar la variable LANG y vi que Linux usa por defecto UTF-8 y casualmente la secuencia E2 80 92 es 84 pero en UTF-8, por lo que lo que requiero es ver de que manera puedo cambiar la codificacion de Linux para que me de los valores que requiero.

Ya intente con en_US.iso8859-1, en_US.iso8859-15, MX.iso8859-1 sin resultados.

Solo los caracteres arriba de 127 son codificados en 3 bytes en lugar de uno solo,
¿cómo puedo variar la configuracion de Linux para poder codificar y mandar los bytes que requiero?
¿cuál es la codificación que debo usar?
¿es posible?

Agradezco de antemano toda la ayuda que me puedan ofrecer
Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Java y codificacion de Linux

Publicado por Tom (346 intervenciones) el 16/06/2009 10:09:50
No tienes que cambiar la codificación de Linux. Eso sería contraproducente.

Lo que tienes que hacer es arreglar el programa que _lee_ el string, para que lo pase de cp1252 al "locale" por defecto de tu máquina.

También podrías usar UTF-8 al escribir el string y quitarte de problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Java y codificacion de Linux

Publicado por Luigikhan (3 intervenciones) el 16/06/2009 18:46:47
Te agradezo mucho la atencion brindada Tom.

En efecto ya he cambiado la codificacion local y por varias mas, aún asi el resultado es siempre el mismo. Incluso la codificacion interna del proyecto, no solo la codificacion de caracteres.No importa en qué codificación genere el proyecto, al final la codificación que se toma al enviar el string es la que esta dada de alta en el sistema de Linux, al cambiar los idiomas los caracteres al ser impresos en pantalla varian aún cuando la codificación interna no se cambie.

El detalle es que el proyecto se ejecuta en Linux pero se envia a un sistema dentro de una plataforma windows, que se basa en ascii.

Cuando se ejecuta el proyecto en windows todos los caracteres se codifican sin error, pero al enviarse el string desde Linux, el string se recibe en UTF-8, como lo ejemplifique en la nota anterior.

Revisé la configuración del sistema y dicho idioma era es_MX.UTF-8 UTF-8 y lo he variado a es_MX 8859-1, en_US 8859-1 y en_US.iso8859-1 y en_US.iso8859-15 mediante sudo dpkg-reconfigure locales. pero aun no logro que los caracteres sean los mismos al usar cp1252 que es el ASCII extendido, esos caracteres son los que necesito imprimir en Linux.

Por lo anterior supuse que si variaba el juego de idioma podria resolverlo y han variado los resultados pero sin obtener aun el ascii extendido.

Ignoro completamente si sea necesario configurar algo mas o modificar archivos de Linux para asegurar los caracteres, o si solo es mediante sudo dpkg-reconfigure locales. O si mi enfoque es completamente incorrecto aparte de lo que me ha llevado a esta posible solucion.

SI tienes algo mas que me pueda ayudar o en alcararame mi error te lo agradeceria mucho
Gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Java y codificacion de Linux

Publicado por Tom (346 intervenciones) el 22/06/2009 12:31:36
Lo que te decía es que, a mi entender, el código de caracteres depende de tu aplicación, no del S.O.

Es decir _tus_programas_ deben especificar el código en el que escriben.

Si no puedes modificar la aplicación que lee, en la que envía puedes usar, por ejemplo:

OutputStreamWriter()

y especificar el charset 'Cp1252' (o el que quieras: http://www.websina.com/bugzero/kb/java-encoding-charset.html);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Java y codificacion de Linux

Publicado por Luigikhan (1 intervención) el 04/07/2009 01:57:08
Hola Buen día.
Tienes toda la razón, en la aplicación de java se especifíca la codificación a usar, lo interesante de este asunto es que aún cuando cambies el charset en una aplicación de java, los valores que se envíen por el sistema operativo hablando de Linux dependen mucho de la codificación que use dicho sistema operativo

.Lo anterior significa que si tienes una cadena de caracteres y los imprimes en pantalla con un charset cp1252 espeficicado en la aplicación de java, pero Linux tiene el LANG en UTF-8 imprimiras un juego de caracteres por pantalla (NOTA: tomando en cuenta que son caracteres ASCII con un valor en byte arriba de 127) , pero si cambias el LANG por ejemplo a ISO-8859 y vuelves a imprimir la cadena con el mismo charset cp1252 los caracteres serán impresos de manera diferente.

Afortunadamente he logrado resolver este problema variando tanto el LANG de linux como de la codificación interna de java para que la combinación de como resultado los valores ASCII que espera la aplicación basada en windows.

El problema radicaba principalmente en que Linux codificaba en UTF-8 y de ahi la primera nota donde expuse los conjuntos de bytes adicionales y, al cambiarlo por un LANG diferente de UTF-8 el problema se soluciono. ya que no tuve que modificar ninguna linea de mi aplicación.

Por lo que repito, tu última nota es acertada pero para poder enviar cadenas mediante sockets con valores arriba de 127 por caracter entre plataformas distintas como lo es Linux y Windows, no solo es necesario considerar el charset interno de java, sino el LANG del sistema operativo, en este caso Linux.

(NOTA: si los valores son los valores ASCII estandar, del 0 al 127 no importa la codificación de Linux y windows, pero no debemos olvidar que java codifica bytes con signo, esto es del -127 a 127 y el ASCII extendido no se puede interpretar con el charset por defecto de java, de ahi que para todo este tema sea importante cambiar los charsets, primero de java para que pueda interpretar los bytes del 128 a 255 y despues en linux para que dichos bytes no se dividan en juegos de 3 bytes, si la aplicación que recibe el string estuviera también en ambiente linux no importaria la segunda codificación , pero es un enlace de Linux a Windows y ambos sistemas codifican diferente. )

Muchas gracias por tu ayuda, aun cuando lo he resuelto de la manera en que te lo he explicado, no dejo de agradecer tu tiempo y tu apoyo ya que muchas veces es dificil que las personas se entreguen en ayudar a los demas. De verdad mi sincero agradecimiento.

Y si alguien tiene dudas con todo este asunto con todo gusto les puedo ayudar.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Java y codificacion de Linux

Publicado por Tom (346 intervenciones) el 15/07/2009 16:28:13
Estás dando vueltas a lo mismo, sin parar.

A ver, si tu aplicación (pongamos un servidor java en Win) espera cp1252, debes enviárselo en cp1252.

Si otra aplicación, pongamos una consola de Linux, espera datos en UTF8, debes enviárselos en UTF8.

Debes separar mentalmente, para hacerte a la idea, los datos de su representación. La consola de Linux espera datos de un tipo determinado y tú se los envías de otro. Lógicamente no los "pinta" bien.

Pero ese no era el caso, se suponía que tú querías enviárselos a una aplicación windows que esperaba caracteres codificados en cp1252 ¿no?

Resumiendo, para enviar datos por un socket a una aplicación, no hace falta que los "pintes" en ninguna consola. El socket transmite lo que le mandes, en forma de cadenas de bytes, y ni la librería de sockets ni el S.O. (faltaría más) se van a a preocupar en absoluto de lo que tú quieras representar con ese chorro de bytes (caracteres chinos, datos de un sensor de temperatura, o una imagen jpeg).

<b>Así que, por favor, para poder __enviar__ cadenas mediante sockets, te importa un pito el LANG del S.O. Cuando te importa es cuando quieres _representar_ esos caracteres.</b>

Y, si me apuras, siempre puedes usar una rutina (que las hay) de conversión entre códigos antes de tratar de escribir en consola.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Java y codificacion de Linux

Publicado por luigikhan (3 intervenciones) el 18/07/2009 09:12:05
Lamento mucho tu reacción y tu lenguaje, parece ser que la primera impresión no fue la correcta en mi caso.
Afortunadamente como mencioné logré solucionarlo. Y si eso no funciona para ti no creo conveniente tu reacción ya que nunca dije que fueras ignorante en la materia, ¿pero que caso tiene postear a tú manera si de lo que se trata es de ayudar a los demás?

No creas que soy neófito en esto, tampoco soy un ignorante en la materia. Yo no estoy aqui para discutir de temas sino para tener ideas y ayudar a las personas que como en nuestro caso llegan a este foro en busca de ayuda. Y para todo esto se debe tener la mente abierta a dichas sugerencias y ayuda, tal como yo lo hice y te agredeci en su momento.

De todos modos te agradezco tus palabras de nuevo, pero creo que aqui hay muchas personas que se merecen respeto y por lo mismo deberías de tomarlo en cuenta.

Saludos y buen día.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Java y codificacion de Linux

Publicado por Yuki (1 intervención) el 18/06/2010 16:52:00
Hola!!1 oye se que tiene 1 año desde que se publicó el ultimo post pero por favor no se si me puedas ayudar , ahh estoy desesperada, tengo un problema muy parecido al tuyo. Mi aplicación está desarrollada en myeclipse, con windows pero al montar el war en linux tengo problemas con el encoding
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Java y codificacion de Linux

Publicado por nn (1 intervención) el 22/05/2013 16:53:37
Lamentable, demasida discusion y despues dicen lo resolvi pero en ningun momento muestra como lo resolvio que era eso lo que importaba, si no son capaces de responder lo k importa no sirven
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar