without utf8 ufeff sublime convertir caracteres bom acentos java utf-8 character-encoding

java - utf8 - Cómo validar si una cadena UTF-8 contiene caracteres mal codificados



utf-8 encoding (2)

No puedes hacer eso una vez que tienes la cadena, tienes que hacerlo mientras todavía tienes la entrada en bruto. Una vez que tenga la cadena, no hay forma de saber automáticamente si se intentó que la entrada fuera realmente sin algunas pruebas realmente frágiles. Por ejemplo:

public static boolean isUTF8MisInterpreted( String input ) { //convenience overload for the most common UTF-8 misinterpretation //which is also the case in your question return isUTF8MisInterpreted( input, "Windows-1252"); } public static boolean isUTF8MisInterpreted( String input, String encoding) { CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); CharsetEncoder encoder = Charset.forName(encoding).newEncoder(); ByteBuffer tmp; try { tmp = encoder.encode(CharBuffer.wrap(input)); } catch(CharacterCodingException e) { return false; } try { decoder.decode(tmp); return true; } catch(CharacterCodingException e){ return false; } } public static void main(String args[]) { String test = "guide (but, yeah, it’s okay to share it with ‘em)."; String test2 = "guide (but, yeah, it’s okay to share it with ‘em)."; System.out.println( isUTF8MisInterpreted(test)); //true System.out.println( isUTF8MisInterpreted(test2)); //false }

Si aún tiene acceso a la entrada en bruto, puede ver si una matriz de bytes equivale a secuencias de bytes utf-8 totalmente válidas con esto:

public static boolean isValidUTF8( byte[] input ) { CharsetDecoder cs = Charset.forName("UTF-8").newDecoder(); try { cs.decode(ByteBuffer.wrap(input)); return true; } catch(CharacterCodingException e){ return false; } }

También puede usar CharsetDecoder con secuencias, de forma predeterminada, lanza una excepción tan pronto como ve bytes no válidos en la codificación dada.

En un conjunto de datos grande tengo algunos datos que se parecen a esto:

"guide (but, yeah, it’s okay to share it with ‘em)."

Abrí el archivo en un editor hexadecimal y ejecuté los datos de bytes sin procesar a través de un algoritmo de detección de codificación de caracteres ( http://code.google.com/p/juniversalchardet/ ) y se detectó positivamente como UTF-8.

Me parece que la fuente de los datos malinterpretó el conjunto de caracteres original y escribió UTF-8 válido como la salida que he recibido.

Me gustaría validar los datos lo mejor que pueda. ¿Hay algún algoritmo / heurística por ahí que pueda ayudarme a probar la validación?


Si está utilizando HTML5, simplemente agregue <meta charset="UTF-8"> dentro de <head>

para HTML4 <meta http-equiv="Content-type" content="text/html;charset=UTF-8">