Pregunta

¿Existe alguna biblioteca java gratuita que pueda usar para convertir cadenas en una codificación a otra codificación, algo como iconv ? Estoy usando la versión 1.3 de Java.

¿Fue útil?

Solución

No necesita una biblioteca más allá de la estándar; solo use Charset . (Puedes usar los métodos String de los constructores y getBytes, pero personalmente no me gusta solo trabajar con los nombres de las codificaciones de caracteres. Demasiado espacio para los errores tipográficos).

EDITAR: Como se señaló en los comentarios, aún puede usar instancias de Charset pero tiene la facilidad de uso de los métodos de String: new String (bytes, charset) y String. getBytes (conjunto de caracteres) .

Consulte " Codificación de URL (o: '¿Qué son esos " < código>% 20 " códigos en las URL? ') " ;.

Otros consejos

CharsetDecoder debe ser lo que estás buscando, ¿no?

Muchos protocolos y archivos de red almacenan sus caracteres con un conjunto de caracteres orientado a bytes, como ISO-8859-1 ( ISO-Latin-1 ).
Sin embargo, la codificación de caracteres nativos de Java es Unicode UTF16BE (Sixteen- Formato de transformación UCS de bits, orden de bytes big-endian).

Consulte Charset . Eso no significa que UTF16 sea el conjunto de caracteres predeterminado (es decir, el mapeo predeterminado entre secuencias de dieciséis bits Unidades de código Unicode y secuencias de bytes "):

  

Cada instancia de la máquina virtual Java tiene un conjunto de caracteres predeterminado, que puede o no ser uno de los conjuntos de caracteres estándar.
  [ US-ASCII , ISO-8859-1 aka ISO-LATIN-1 , UTF-8 , < código> UTF-16BE
, UTF-16LE , UTF-16 ]
  El conjunto de caracteres predeterminado se determina durante el inicio de la máquina virtual y generalmente depende de la configuración regional y el conjunto de caracteres que utiliza el sistema operativo subyacente.

Este ejemplo demuestra cómo convertir ISO-8859-1 codificados en bytes en un ByteBuffer en una cadena en un CharBuffer y viceversa.

// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();

try {
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
    // The new ByteBuffer is ready to be read.
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
    // The new ByteBuffer is ready to be read.
    CharBuffer cbuf = decoder.decode(bbuf);
    String s = cbuf.toString();
} catch (CharacterCodingException e) {
}

Me gustaría agregar que si la cadena se codifica originalmente con la codificación incorrecta, sería imposible cambiarla a otra codificación sin errores. La pregunta no indica que la conversión aquí se realice desde una codificación incorrecta a una codificación correcta, pero personalmente me topé con esta pregunta solo por esta situación, por lo que solo un aviso para otros también.

Esta respuesta en otra pregunta da una explicación de por qué la conversión no siempre produce resultados correctos https://stackoverflow.com/a/2623793/4702806

Es mucho más fácil si piensa en Unicode como un conjunto de caracteres (que en realidad lo es, es básicamente el conjunto numerado de todos los caracteres conocidos). Puede codificarlo como UTF-8 (1-3 bytes dependiendo del carácter) o tal vez UTF-16 (2 bytes por carácter o 4 bytes utilizando pares sustitutos).

De vuelta en la niebla del tiempo que Java usaba para usar UCS-2 para codificar el conjunto de caracteres Unicode. Esto solo podía manejar 2 bytes por carácter y ahora está obsoleto. Fue un truco bastante obvio para agregar pares sustitutos y subir a UTF-16.

Mucha gente piensa que deberían haber usado UTF-8 en primer lugar. Cuando Java se escribió originalmente, Unicode tenía más de 65535 caracteres de todos modos ...

UTF-8 y UCS-2 / UTF-16 se pueden distinguir razonablemente fácilmente a través de una marca de orden de bytes al comienzo del archivo. Si esto existe, es una buena apuesta que el archivo está en esa codificación, pero no es una certeza. También puede encontrar que el archivo está en una de esas codificaciones, pero no tiene una marca de orden de bytes.

No sé mucho acerca de ISO-8859-2, pero no me sorprendería si casi todos los archivos son un archivo de texto válido en esa codificación. Lo mejor que podrás hacer es verificarlo heurísticamente. De hecho, la página de Wikipedia al respecto sugiere que solo el byte 0x7f no es válido.

No hay idea de leer un archivo " como está " y sin embargo, obtener texto: un archivo es una secuencia de bytes, por lo que debe aplicar una codificación de caracteres para decodificar esos bytes en caracteres.

Fuente por stackoverflow

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top