一旦在Java机器上将字节数组转换为字符串,您将获得(在大多数机器上默认)UTF-16编码的字符串。摆脱非UTF-8字符的正确解决方案是使用以下代码:
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]|" +
"[\\\\xC0-\\\\xDF][\\\\x80-\\\\xBF]|" +
"[\\\\xE0-\\\\xEF][\\\\x80-\\\\xBF]{2}|" +
"[\\\\xF0-\\\\xF7][\\\\x80-\\\\xBF]{3}"
, ""));
}
如果您想验证某个字符串是否包含非UTF8字符,可以使用Pattern.matches,例如:
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]|" +
"[\\\\xC0-\\\\xDF][\\\\x80-\\\\xBF]|" +
"[\\\\xE0-\\\\xEF][\\\\x80-\\\\xBF]{2}|" +
"[\\\\xF0-\\\\xF7][\\\\x80-\\\\xBF]{3}"
+ ").*"
, values[i]));
}
如果您有字节数组可用,则可以使用以下内容更好地过滤它们:
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]|" +
"[\\xC0-\\xDF][\\x80-\\xBF]|" +
"[\\xE0-\\xEF][\\x80-\\xBF]{2}|" +
"[\\xF0-\\xF7][\\x80-\\xBF]{3}"
, ""));
}
如何使整个Web应用程序兼容UTF8,请阅读此处:
在Java Web应用程序中如何使UTF-8工作
有关字节编码和字符串的更多信息。
您可以在此处检查您的模式这里。
PHP中同样适用这里。