Revisamos de forma completamente cada escritos en nuestro espacio con el objetivo de mostrarte siempre la información más veraz y actualizada.
Solución:
UTF-8 no es un conjunto de caracteres, es un carácter codificacióncomo UTF-16.
UTF-8 es capaz de codificar cualquier carácter Unicode y cualquier texto Unicode en una secuencia de bytes, por lo que no existen caracteres que no sean adecuados para UTF-8.
Estás usando un constructor de String
que solo ocupa un byte array (Cadena(byte[] bytes)) que según los javadocs:
Construye una nueva cadena decodificando el especificado array de bytes utilizando el conjunto de caracteres predeterminado de la plataforma.
Utiliza el conjunto de caracteres predeterminado de la plataforma para interpretar los bytes (para convertir los bytes en caracteres). No use esto. En cambio, al convertir un byte array para String
especifique la codificación que desea usar explícitamente con String(byte[] bytes, Charset juego de caracteres) constructor.
Si tiene problemas con ciertos caracteres, lo más probable es que se deba al uso de diferentes conjuntos de caracteres o codificaciones en el lado del servidor y en el lado del cliente (navegador + HTML). Asegúrese de usar UTF-8 en todas partes, no mezcle codificaciones y no use la codificación predeterminada de la plataforma.
Algunas lecturas de cómo lograr esto:
¿Cómo hacer que UTF-8 funcione en aplicaciones web de Java?
Tal vez la respuesta con CharsetDecoder de esta pregunta ayude. Puede cambiar CodingErrorAction a REPLACE y establecer un reemplazo en mi ejemplo “?”. Esto generará un reemplazo dado string para secuencias de bytes inválidas. En este ejemplo, se lee y decodifica un archivo de prueba de estrés y capacidad de decodificador UTF-8:
CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder();
utf8Decoder.onMalformedInput(CodingErrorAction.REPLACE);
utf8Decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
utf8Decoder.replaceWith("?");
// Read stress file
Path path = Paths.get("/UTF-8-test.txt");
byte[] data = Files.readAllBytes(path);
ByteBuffer input = ByteBuffer.wrap(data);
// UTF-8 decoding
CharBuffer output = utf8Decoder.decode(input);
// Char buffer to string
String outputString = output.toString();
System.out.println(outputString);