Pregunta

¿Existe una manera fácil de evitar problemas de codificación de texto?

¿Fue útil?

Solución

Realmente no se puede evitar lidiar con los problemas de codificación de texto, pero existen soluciones:

Sólo necesita elegir la codificación de su elección.

Otros consejos

Si está comenzando con una Cadena, también puede hacer lo siguiente:

new ByteArrayInputStream(inputString.getBytes("UTF-8"))

Bueno, un Reader se ocupa de caracteres y un InputStream se ocupa de bytes.La codificación especifica cómo desea representar sus caracteres como bytes, por lo que no puede ignorar el problema.En cuanto a evitar problemas, mi opinión es:elija un juego de caracteres (p. ej."UTF-8") y quédate con él.

En cuanto a cómo hacerlo realmente, como se ha señalado, "los nombres obvios para estas clases son LectorInputStream y EscritorOutputStream." Sorprendentemente "estos no están incluidos en la biblioteca de Java"aunque las clases 'opuestas', Lector de flujo de entrada y Escritor de flujo de salida son incluido.

Entonces, mucha gente ha ideado sus propias implementaciones, incluidas apache OI comunes.Dependiendo de los problemas de licencia, probablemente podrá incluir la biblioteca commons-io en su proyecto, o incluso copiar una parte del código fuente (que se puede descargar aquí).

Como puede ver, la documentación de ambas clases establece que "todas las codificaciones de juegos de caracteres admitidas por JRE se manejan correctamente".

NÓTESE BIEN.Un comentario sobre una de las otras respuestas aquí menciona este error.Pero eso afecta a los apaches. Hormiga Clase ReaderInputStream (aquí), no el apache OI comunes Clase ReaderInputStream.

También tenga en cuenta que, si está comenzando con un String, puede omitir la creación de un StringReader y crear un InputStream en un solo paso usando org.apache.commons.io.IOUtils de OI comunes al igual que:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

Por supuesto, aún debes pensar en la codificación del texto, pero al menos la conversión se realiza en un solo paso.

Usar:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

De esta manera no se requiere una conversión inicial a String y luego a byte[], que asigna mucha más memoria dinámica, en caso de que el informe sea grande.Se convierte en bytes sobre la marcha a medida que se lee la secuencia, directamente desde StringBuffer.

Usa CharSequenceInputStream del proyecto Apache Commons IO.

Los nombres obvios para estas clases son ReaderInputStream y WriterOutputStream.Lamentablemente, estos no están incluidos en la biblioteca de Java.Sin embargo, Google es tu amigo.

No estoy seguro de que vaya a solucionar todos los problemas de codificación de texto, que son una pesadilla.

Hay una RFE, pero está cerrado, no se solucionará.

No puedes evitar los problemas de codificación de texto, pero Apache commons-io tiene

Tenga en cuenta que estas son las bibliotecas a las que se hace referencia en la respuesta de Peter de koders.com, solo enlaces a la biblioteca en lugar del código fuente.

¿Estás intentando escribir el contenido de un Reader a una OutputStream?Si es así, le resultará más fácil envolver el OutputStream en un OutputStreamWriter y escribe el chars de la Reader hacia Writer, en lugar de intentar convertir al lector en un InputStream:

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block

Una advertencia al usar WriterOutputStream: no siempre maneja la escritura de datos binarios en un archivo correctamente/de la misma manera que un flujo de salida normal.Tuve un problema con esto que me llevó un tiempo localizar.

Si puede, le recomendaría usar una secuencia de salida como base, y si necesita escribir cadenas, use un contenedor OUtputStreamWriter alrededor de la secuencia para hacerlo.Es mucho más confiable convertir texto a bytes que al revés, razón por la cual WriterOutputStream no forma parte de la biblioteca estándar de Java.

Puedes usar cactus (sin métodos estáticos, sólo objetos):

También puedes convertir al revés:

Para leer una cadena en una secuencia usando solo lo que proporciona Java.

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top