Una vez que convierte la matriz de bytes a Cadena en la máquina Java, obtendrá (por defecto en la mayoría de las máquinas) una cadena codificada en UTF-16. La solución adecuada para deshacerse de caracteres UTF-8 no es con el siguiente código:
String[] values = {"\\xF0\\x9F\\x98\\x95", "\\xF0\\x9F\\x91\\x8C", "/*", "look into my eyes 〠.〠", "fkdjsf ksdjfslk", "\\xF0\\x80\\x80\\x80", "aa \\xF0\\x9F\\x98\\x95 aa"};
for (int i = 0; i < values.length; i++) {
System.out.println(values[i].replaceAll(
"[\\\\x00-\\\\x7F]|" + //single-byte sequences 0xxxxxxx
"[\\\\xC0-\\\\xDF][\\\\x80-\\\\xBF]|" + //double-byte sequences 110xxxxx 10xxxxxx
"[\\\\xE0-\\\\xEF][\\\\x80-\\\\xBF]{2}|" + //triple-byte sequences 1110xxxx 10xxxxxx * 2
"[\\\\xF0-\\\\xF7][\\\\x80-\\\\xBF]{3}" //quadruple-byte sequence 11110xxx 10xxxxxx * 3
, ""));
}
o si desea validar si alguna cadena contiene caracteres no utf8 que usaría Pattern.matches como:
String[] values = {"\\xF0\\x9F\\x98\\x95", "\\xF0\\x9F\\x91\\x8C", "/*", "look into my eyes 〠.〠", "fkdjsf ksdjfslk", "\\xF0\\x80\\x80\\x80", "aa \\xF0\\x9F\\x98\\x95 aa"};
for (int i = 0; i < values.length; i++) {
System.out.println(Pattern.matches(
".*(" +
"[\\\\x00-\\\\x7F]|" + //single-byte sequences 0xxxxxxx
"[\\\\xC0-\\\\xDF][\\\\x80-\\\\xBF]|" + //double-byte sequences 110xxxxx 10xxxxxx
"[\\\\xE0-\\\\xEF][\\\\x80-\\\\xBF]{2}|" + //triple-byte sequences 1110xxxx 10xxxxxx * 2
"[\\\\xF0-\\\\xF7][\\\\x80-\\\\xBF]{3}" //quadruple-byte sequence 11110xxx 10xxxxxx * 3
+ ").*"
, values[i]));
}
Si usted tiene la matriz de bytes disponible que puede filtrar aún más correctamente con:
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(bytes), "UTF-8"));
for (String currentLine; (currentLine = bufferedReader.readLine()) != null;) {
currentLine = currentLine.replaceAll(
"[\\x00-\\x7F]|" + //single-byte sequences 0xxxxxxx
"[\\xC0-\\xDF][\\x80-\\xBF]|" + //double-byte sequences 110xxxxx 10xxxxxx
"[\\xE0-\\xEF][\\x80-\\xBF]{2}|" + //triple-byte sequences 1110xxxx 10xxxxxx * 2
"[\\xF0-\\xF7][\\x80-\\xBF]{3}" //quadruple-byte sequence 11110xxx 10xxxxxx * 3
, ""));
}
para la toma de una aplicación web entera sea compatible con UTF8 leer aquí:
How to get UTF-8 working in Java webapps
More on Byte Encodings and Strings.
Puede verificar su patrón here.
Lo mismo en PHP here.
Su pregunta es confusa. La libra es un personaje válido UTF-8. Además, UTF-8 cubre prácticamente todos los personajes que el mundo conoce. ¿Podrías publicar algunos ejemplos del mundo real? ¿No quieres decir que quieres deshacerte de los personajes que no son ASCII? – BalusC
Supongo que recibirá XML que dice ser UTF-8, pero en realidad es Windows-1252, ISO 8859-1 más o menos. Eso haría que cualquier carácter no ASCII sea inválido porque está codificado incorrectamente. ¿El requisito es explícitamente eliminar esos caracteres, o más bien corregir los errores XML (que presumiblemente se eliminan eliminando los caracteres ofensivos)? En el caso de este último, debería poder convertir su entrada a UTF-8 antes de analizarla, suponiendo que su cliente siempre usa la misma codificación (incorrecta). No conozco suficiente Java para decirte cómo hacerlo. – mercator
Tenga en cuenta que debe hacer esto _NOT_ utilizando herramientas XML, porque el analizador puede terminar cuando la entrada no es 100% correcta. –