<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Codificación de carácteres y Java</title>
	<atom:link href="http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/</link>
	<description>Dani Latorre - Desarrollador y algunas cosas más</description>
	<lastBuildDate>Thu, 09 Feb 2012 09:01:24 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Julio César</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-10139</link>
		<dc:creator>Julio César</dc:creator>
		<pubDate>Thu, 11 Nov 2010 23:58:29 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-10139</guid>
		<description>Hola que tal! Muchas gracias, estuve buscando esta información y por ningun lado la encontraba y cuando lo hacia no era tan clara, basto con hacer unas pruebas con toda la información que se publica en este foro y listo jejeje pude eliminar los caracteres raros de mi archivo de salida!</description>
		<content:encoded><![CDATA[<p>Hola que tal! Muchas gracias, estuve buscando esta información y por ningun lado la encontraba y cuando lo hacia no era tan clara, basto con hacer unas pruebas con toda la información que se publica en este foro y listo jejeje pude eliminar los caracteres raros de mi archivo de salida!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: GreenEyed</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3933</link>
		<dc:creator>GreenEyed</dc:creator>
		<pubDate>Wed, 21 May 2008 19:30:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3933</guid>
		<description>Gracias a ti, estas discusiones quieras que no siempre ayudan a aclarar las cosas, y asi al que venga detras y lo lea le quedara mejor.
Ademas, no podia dejar que otro &quot;Dani&quot; se quedara con una idea que no es... tenemos que mantener el nivel :P.

Saludos, tocayo ;)</description>
		<content:encoded><![CDATA[<p>Gracias a ti, estas discusiones quieras que no siempre ayudan a aclarar las cosas, y asi al que venga detras y lo lea le quedara mejor.<br />
Ademas, no podia dejar que otro &#8220;Dani&#8221; se quedara con una idea que no es&#8230; tenemos que mantener el nivel <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Saludos, tocayo <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dani</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3930</link>
		<dc:creator>Dani</dc:creator>
		<pubDate>Wed, 21 May 2008 16:17:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3930</guid>
		<description>Mmmm GreenEyed, creo que al final te voy a dar la razón :).

Tu último párrafo me hizo dudar y he comprobado que sí es como tú dices, corrijo el post.

Muchas gracias por &quot;ponerte tozudo&quot; para hacerme entrar en razón ;)</description>
		<content:encoded><![CDATA[<p>Mmmm GreenEyed, creo que al final te voy a dar la razón <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Tu último párrafo me hizo dudar y he comprobado que sí es como tú dices, corrijo el post.</p>
<p>Muchas gracias por &#8220;ponerte tozudo&#8221; para hacerme entrar en razón <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: GreenEyed</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3913</link>
		<dc:creator>GreenEyed</dc:creator>
		<pubDate>Tue, 20 May 2008 18:39:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3913</guid>
		<description>Totalmente de acuerdo en que la documentacion es mas que confusa y el tema en si ya lo es. Yo lo tengo tan mirado por que antes pensaba que era como tu decias hasta que una vez tuve problemas y dandole vueltas y mirando mas cosas &quot;encontre la luz&quot; y todo cuadra.

De todas formas, al leer (constructor) no se cambia la codificacion de los bytes, se cambia la forma de interpretarlos. Y al escribir (getBytes) no se cambia la cadena, se cambia la forma de transformar la cadena en bytes.


El ejemplo, asi como está, hace:
.- El String esta declarado como constante, crea un String y se codifica internamente en UTF-16
.- El .getBytes(...UTF-8&quot;) devuelve la ristra en bytes, segun se codifica en UTF-8, de la cadena.
.- El new String(bytes,&quot;ISO-8859-1&quot;) interpreta la ristra de bytes como si codificaran unos caracteres en ISO, y los convierte en un String (internamente con UTF16).
.- Como los caracteres que he puesto, a conciencia, no se  representan igual en UTF-8 y LATIN1, pues se el constructor los interpreta mal.

Haciendo una burda analogia, supongamos que UTF8 codifica las letras en numeros normales y LATIN1 en numeros romanos.

&quot;ABC&quot;.getBytes(UTF-8) = 1,2,3
&quot;ABC&quot;.getBytes(LATIN1) = I,II,III

new String({1,2,3},UTF-8) = &quot;ABC&quot;
new String({I,II,II},LATIN1) = &quot;ABC&quot;

new String(&quot;ABC&quot;.getBytes(UTF-8),LATIN1) daria error por que el 1 en LATIN1 no es la A, el 2 no... etc.

La transformacion que dices que hay que hacer a veces es cuando tienes que leer unos bytes que representan una cadena y estan codificados en un charset, llamemosle charsetX, distinto del de por defecto (usas new String(bytes,charsetX) o cuando tu tienes que esribir unos bytes en una codificacion diferente de la por defecto, que usas getBytes(charsetX) y escribes los bytes.

S!</description>
		<content:encoded><![CDATA[<p>Totalmente de acuerdo en que la documentacion es mas que confusa y el tema en si ya lo es. Yo lo tengo tan mirado por que antes pensaba que era como tu decias hasta que una vez tuve problemas y dandole vueltas y mirando mas cosas &#8220;encontre la luz&#8221; y todo cuadra.</p>
<p>De todas formas, al leer (constructor) no se cambia la codificacion de los bytes, se cambia la forma de interpretarlos. Y al escribir (getBytes) no se cambia la cadena, se cambia la forma de transformar la cadena en bytes.</p>
<p>El ejemplo, asi como está, hace:<br />
.- El String esta declarado como constante, crea un String y se codifica internamente en UTF-16<br />
.- El .getBytes(&#8230;UTF-8&#8243;) devuelve la ristra en bytes, segun se codifica en UTF-8, de la cadena.<br />
.- El new String(bytes,&#8221;ISO-8859-1&#8243;) interpreta la ristra de bytes como si codificaran unos caracteres en ISO, y los convierte en un String (internamente con UTF16).<br />
.- Como los caracteres que he puesto, a conciencia, no se  representan igual en UTF-8 y LATIN1, pues se el constructor los interpreta mal.</p>
<p>Haciendo una burda analogia, supongamos que UTF8 codifica las letras en numeros normales y LATIN1 en numeros romanos.</p>
<p>&#8220;ABC&#8221;.getBytes(UTF-8) = 1,2,3<br />
&#8220;ABC&#8221;.getBytes(LATIN1) = I,II,III</p>
<p>new String({1,2,3},UTF-8) = &#8220;ABC&#8221;<br />
new String({I,II,II},LATIN1) = &#8220;ABC&#8221;</p>
<p>new String(&#8220;ABC&#8221;.getBytes(UTF-8),LATIN1) daria error por que el 1 en LATIN1 no es la A, el 2 no&#8230; etc.</p>
<p>La transformacion que dices que hay que hacer a veces es cuando tienes que leer unos bytes que representan una cadena y estan codificados en un charset, llamemosle charsetX, distinto del de por defecto (usas new String(bytes,charsetX) o cuando tu tienes que esribir unos bytes en una codificacion diferente de la por defecto, que usas getBytes(charsetX) y escribes los bytes.</p>
<p>S!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dani</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3907</link>
		<dc:creator>Dani</dc:creator>
		<pubDate>Tue, 20 May 2008 14:46:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3907</guid>
		<description>Vale, ahora te he entendido :)

Y sí, toda la razón, se modifica la codificación de los bytes y no la del String en sí que siempre será UTF-16 y como han cambiado los bytes cambia el contenido del String.

La cuestión es que en alguna ocasión he tenido que forzar esa transformación de codificación, por no abstraerme de eso las interfaces.

Todo lo que trata sobre estos cambios de codificaciones en el javadoc de la clase String es un poco confuso... al menos para mi:

String(byte[] bytes, String charsetName) 
&quot;Constructs a new String by decoding the specified array of bytes using the specified charset&quot;
¿Un nuevo String decodificando el array de bytes usando el charset especificado?
Se puede entender de las dos maneras... 

getBytes(String charsetName) 
&quot;Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.&quot;
¿Codifica este String en una secuencia de bytes usando el charset nombrado, guardando el resultado en un array de bytes?
Lo mismo...

(Seguramente las traducciones dejan bastante que desear XD)

Y por mi experiencia, quizás me equivoque haciéndolo de memoria pero estoy convencido de esto, el código de ejemplo viene a hacer:
- El array de bytes lo leemos con codificación Latin1 para que el contenido del String &quot;no se vea raro&quot;, con getBytes(&quot;ISO-8859-1&quot;).
- Y ese array lo decodificamos a UTF-8 en la creación del String para que en el destino se guarde &quot;sin verse raro&quot;.

GreenEyed, a ver si llegamos a un acuerdo jejeje</description>
		<content:encoded><![CDATA[<p>Vale, ahora te he entendido <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Y sí, toda la razón, se modifica la codificación de los bytes y no la del String en sí que siempre será UTF-16 y como han cambiado los bytes cambia el contenido del String.</p>
<p>La cuestión es que en alguna ocasión he tenido que forzar esa transformación de codificación, por no abstraerme de eso las interfaces.</p>
<p>Todo lo que trata sobre estos cambios de codificaciones en el javadoc de la clase String es un poco confuso&#8230; al menos para mi:</p>
<p>String(byte[] bytes, String charsetName)<br />
&#8220;Constructs a new String by decoding the specified array of bytes using the specified charset&#8221;<br />
¿Un nuevo String decodificando el array de bytes usando el charset especificado?<br />
Se puede entender de las dos maneras&#8230; </p>
<p>getBytes(String charsetName)<br />
&#8220;Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.&#8221;<br />
¿Codifica este String en una secuencia de bytes usando el charset nombrado, guardando el resultado en un array de bytes?<br />
Lo mismo&#8230;</p>
<p>(Seguramente las traducciones dejan bastante que desear XD)</p>
<p>Y por mi experiencia, quizás me equivoque haciéndolo de memoria pero estoy convencido de esto, el código de ejemplo viene a hacer:<br />
- El array de bytes lo leemos con codificación Latin1 para que el contenido del String &#8220;no se vea raro&#8221;, con getBytes(&#8220;ISO-8859-1&#8243;).<br />
- Y ese array lo decodificamos a UTF-8 en la creación del String para que en el destino se guarde &#8220;sin verse raro&#8221;.</p>
<p>GreenEyed, a ver si llegamos a un acuerdo jejeje</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: GreenEyed</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3904</link>
		<dc:creator>GreenEyed</dc:creator>
		<pubDate>Tue, 20 May 2008 11:38:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3904</guid>
		<description>&quot;me interesa saber como la guarda o forzar como la guarda&quot; El problema de eso es que estas entendiendo el metodo al reves. Con String(bytes,codificacion), lo que le estas diciendo es la codificacion de los bytes que le estas pasando. Internamente String la seguira guardando en UTF-16, si o si. Codificacion se refiere a como estan codificados los bytes, no al String.

Sobre el problema, pasa exactamente lo mismo con getBytes. Con getBytes(codificacion), el parametro codificacion no se refiere a como esta codificado internamente el String, que SIEMPRE esta codificado en UTF-16, se refiere a como quieres que codifique los bytes de salida. Asi que si obtienes los bytes codificados segun ISO y se los pasas a un constructor diciendole que estan codificados en UTF, estas pasandole argumentos incorrectos y te dara un error con algunos caracteres.

Espero que asi quede mas claro :).

Prueba esto a ver si te aclara a lo que me refiero:

System.err.println(&quot;Prueba: &quot;
  + new String(&quot;áéíóú@&quot;.getBytes(&quot;UTF-8&quot;),&quot;ISO-8859-1&quot;))

Verás que el resultado no es &quot;áéíóú@&quot;.

S!</description>
		<content:encoded><![CDATA[<p>&#8220;me interesa saber como la guarda o forzar como la guarda&#8221; El problema de eso es que estas entendiendo el metodo al reves. Con String(bytes,codificacion), lo que le estas diciendo es la codificacion de los bytes que le estas pasando. Internamente String la seguira guardando en UTF-16, si o si. Codificacion se refiere a como estan codificados los bytes, no al String.</p>
<p>Sobre el problema, pasa exactamente lo mismo con getBytes. Con getBytes(codificacion), el parametro codificacion no se refiere a como esta codificado internamente el String, que SIEMPRE esta codificado en UTF-16, se refiere a como quieres que codifique los bytes de salida. Asi que si obtienes los bytes codificados segun ISO y se los pasas a un constructor diciendole que estan codificados en UTF, estas pasandole argumentos incorrectos y te dara un error con algunos caracteres.</p>
<p>Espero que asi quede mas claro <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Prueba esto a ver si te aclara a lo que me refiero:</p>
<p>System.err.println(&#8220;Prueba: &#8221;<br />
  + new String(&#8220;áéíóú@&#8221;.getBytes(&#8220;UTF-8&#8243;),&#8221;ISO-8859-1&#8243;))</p>
<p>Verás que el resultado no es &#8220;áéíóú@&#8221;.</p>
<p>S!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dani</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3892</link>
		<dc:creator>Dani</dc:creator>
		<pubDate>Mon, 19 May 2008 18:49:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3892</guid>
		<description>Hola GreenEyed,

Las dos cadenas al final son la misma, pero en mi caso sí me interesa saber como lo guarda (o más bien forzar cómo lo guarda), prefiero hacerlo en la interfaz de entrada que en la de salida, ya que quién sabe si un día se modifica esa interfaz de entrada (por ejemplo para leer de un fichero de texto en UTF-8) mientras que la codificación de salida no cambiará.

Sobre los posibles problemas, no acabo de entender a qué te refieres, la transformación es de Latin1 a UTF-16 en el getBytes y en el constructor del nuevo String es de UTF-16 a UTF-8.

Sobre el tag y establecer el contentType, es redundante pero como dices, cualquiera se fía de los navegadores :).</description>
		<content:encoded><![CDATA[<p>Hola GreenEyed,</p>
<p>Las dos cadenas al final son la misma, pero en mi caso sí me interesa saber como lo guarda (o más bien forzar cómo lo guarda), prefiero hacerlo en la interfaz de entrada que en la de salida, ya que quién sabe si un día se modifica esa interfaz de entrada (por ejemplo para leer de un fichero de texto en UTF-8) mientras que la codificación de salida no cambiará.</p>
<p>Sobre los posibles problemas, no acabo de entender a qué te refieres, la transformación es de Latin1 a UTF-16 en el getBytes y en el constructor del nuevo String es de UTF-16 a UTF-8.</p>
<p>Sobre el tag y establecer el contentType, es redundante pero como dices, cualquiera se fía de los navegadores <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: GreenEyed</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3891</link>
		<dc:creator>GreenEyed</dc:creator>
		<pubDate>Mon, 19 May 2008 17:08:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3891</guid>
		<description>Hola,
String internamente guarda los caracteres en UTF-16 como dices, asi que no entiendo que diferencia hay, o crees que hay ;), entre valueIso y valueUtf. Las dos cadenas _internamente_ son la misma, lo importante es a la hora de escribir un String como bytes o interpretar un String a partir de unos bytes, pero internamente te da igual como lo guarde.

Es más, supuestamente si haces un getBytes() y luego creas un String con esos bytes con encodings differentes, podrias tener un error ya que estas generando la interpretacion en bytes como ISO-LATIN1 y la estas leyendo como si los bytes fuera UTF-8...
Lo importante son los interfaces, y ahi el emisor y el receptor han de ponerse de acuerdo, como se guarde internamente la informacion deberia dar igual.

Otro tema interesante y largamente comentado pero que aun &quot;muerde&quot; es el de los navegadores y su envio de parametros. Por cierto, el tag http-equiv=&quot;content-type&quot; y el response.setContentType son redundantes, aunque se suelen poner ambos por si acaso, el problema es que si te equivocas y no concuerdan... el resultado es imprevisible, por que cada navegador hace lo que le pasa por... :)

Es un tema interesante.</description>
		<content:encoded><![CDATA[<p>Hola,<br />
String internamente guarda los caracteres en UTF-16 como dices, asi que no entiendo que diferencia hay, o crees que hay <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , entre valueIso y valueUtf. Las dos cadenas _internamente_ son la misma, lo importante es a la hora de escribir un String como bytes o interpretar un String a partir de unos bytes, pero internamente te da igual como lo guarde.</p>
<p>Es más, supuestamente si haces un getBytes() y luego creas un String con esos bytes con encodings differentes, podrias tener un error ya que estas generando la interpretacion en bytes como ISO-LATIN1 y la estas leyendo como si los bytes fuera UTF-8&#8230;<br />
Lo importante son los interfaces, y ahi el emisor y el receptor han de ponerse de acuerdo, como se guarde internamente la informacion deberia dar igual.</p>
<p>Otro tema interesante y largamente comentado pero que aun &#8220;muerde&#8221; es el de los navegadores y su envio de parametros. Por cierto, el tag http-equiv=&#8221;content-type&#8221; y el response.setContentType son redundantes, aunque se suelen poner ambos por si acaso, el problema es que si te equivocas y no concuerdan&#8230; el resultado es imprevisible, por que cada navegador hace lo que le pasa por&#8230; <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Es un tema interesante.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dani</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3890</link>
		<dc:creator>Dani</dc:creator>
		<pubDate>Mon, 19 May 2008 16:02:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3890</guid>
		<description>Hola David,

No conocía esta librería, le pegaré un repaso tranquilamente.

Y lo bueno es que sé que es Joaquin Cuenca, pero parece que no soy dueño de mis dedos XD.

Gracias por ambos apuntes.</description>
		<content:encoded><![CDATA[<p>Hola David,</p>
<p>No conocía esta librería, le pegaré un repaso tranquilamente.</p>
<p>Y lo bueno es que sé que es Joaquin Cuenca, pero parece que no soy dueño de mis dedos XD.</p>
<p>Gracias por ambos apuntes.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: David Calavera</title>
		<link>http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/comment-page-1/#comment-3889</link>
		<dc:creator>David Calavera</dc:creator>
		<pubDate>Mon, 19 May 2008 15:54:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.danilat.com/weblog/2008/05/19/codificacion-de-caracteres-y-java/#comment-3889</guid>
		<description>Hola Dani, una forma de evitar el problema con los properties y los ResourceBundle es usar las librerías de gettext, que manejan mucho mejor estos temas, te dejo una referencia:

http://code.google.com/p/gettext-commons/

por cierto, el autor del post de programa con google es &quot;Joaquin Cuenca&quot; no Joaquin Cuesta.

Saludos</description>
		<content:encoded><![CDATA[<p>Hola Dani, una forma de evitar el problema con los properties y los ResourceBundle es usar las librerías de gettext, que manejan mucho mejor estos temas, te dejo una referencia:</p>
<p><a href="http://code.google.com/p/gettext-commons/" rel="nofollow">http://code.google.com/p/gettext-commons/</a></p>
<p>por cierto, el autor del post de programa con google es &#8220;Joaquin Cuenca&#8221; no Joaquin Cuesta.</p>
<p>Saludos</p>
]]></content:encoded>
	</item>
</channel>
</rss>

