2009-03-11 50 views
5

Necesito convertir un signo de marca UTF-8 en un ISO Latin 1, y guardarlo en una base de datos, que también está codificada en ISO Latin 1.Cómo convertir caracteres UTF-8 a ISO Latin 1?

¿Cómo puedo hacer eso en Java?

He intentado algo así como

String s2 = new String(s1.getBytes("ISO-8859-1"), "utf-8"); 

pero no parece trabajar como lo esperaba.

+0

Eche un vistazo a http://stackoverflow.com/questions/285228/how-to-convert-utf-8-to-us-ascii-in-java No exactamente un duplicado, pero similar. –

Respuesta

5

Una cadena en Java siempre está en Unicode (UTF-16, efectivamente). Las conversiones solo son necesarias cuando intenta pasar de texto a codificación binaria o viceversa.

¿Cuál es el carácter involucrado? ¿Estás seguro de que incluso está presente en ISO Latin 1? Si es así, espero que ese carácter sea almacenado por su base de datos sin ningún problema. No existe el "letrero de marca registrada UTF-8". Podría tener "los bytes que representan el signo de marca registrada UTF-8 codificados", pero eso sería una matriz de bytes, no una cadena.

EDITAR: Si se refiere a Unicode trademark character U + 2122, eso está fuera del rango de ISO-Latin-1. Ahí está el registered trademark character U + 00AE, que no es lo mismo (ya sea en apariencia o en sentido jurídico, IIRC), pero puede ser mejor que nada - si desea utilizar ese entonces sólo tiene que utilizar:

string replaced = original.replace('\u2122', '\u00ae'); 
+2

Pero <®> y <™> tienen significados bastante diferentes. –

+0

Por lo tanto "no es lo mismo (ya sea en apariencia o significado legal" –

2
  1. Lee lo que Jon Skeet te dijo. El código que publicaste es basura (toma la forma codificada en UTF-8 de tu Cadena y la interpreta como si fuera ISO-8859-1, esto no logra nada útil).
  2. La codificación ISO-8859-1 (a.k.a Latin1) no contiene el carácter de marca registrada "™".
0

Tuve un problema similar y lo resolví convirtiendo los caracteres no traducibles en Entitys. Si muestra la información más tarde como html, está bien de todos modos.

De lo contrario, podría tratar de convertirlos a unicode.

ejemplo en Python con "Marca":

s = u'yellow bananas\u2122'.encode('latin1', 'xmlcharrefreplace') 
# s is 'yellow bananas&#8482;' 
4

Por lo que yo entiendo, usted está tratando de almacenar caracteres (de s1) que contiene caracteres Latin-1 no en una base de datos que sólo es compatible con ISO 8859-1.

  • En primer lugar, estoy de acuerdo con los demás en decir que es una mala idea.
    Tenga en cuenta que CP1252 está cerca de la norma ISO-8859-1 (1 byte por carácter) e incluye

  • Ahora, a anwser su pregunta, creo que hizo todo lo contrario ..
    quiere codificar UTF-8 bytes en ISO-8859-1:

    String s2 = new String(s1.getBytes("UTF-8"), "ISO-8859-1"); 
    

    de esta manera, s2 es una cadena characher que, una vez codificado en ISO-8859-1, devolverá una matriz de bytes que puede parecer como UTF-8 válido bytes.

    Para recuperar la cadena original, que haría

    String s1 = new String(s2.getBytes("ISO-8859-1"),"UTF-8"); 
    

pero espera! Al hacer esto, espera que cualquier byte se pueda decodificar con ISO-8859-1 .. y que su DB aceptará tales datos. etc.

De hecho, es realmente inseguro porque oficialmente, ISO-8859-1 doesn't have chars for any byte values. Por ejemplo, de 80 a 9F.

Entonces,

byte[] b = { -97, -100, -128 }; 
System.out.println(new String(b,"ISO-8859-1")); 

mostraría ???

Sin embargo, en Java , s.getBytes("ISO-8859-1") de hecho restaura la matriz inicial.

+1

Gran respuesta, su comprensión de los conjuntos es excelente – paj28

Cuestiones relacionadas