如何在Java中替换/删除UTF-8字符串中的4(+)字节字符?
由于MySQL 5.1不支持4字节UTF-8序列,因此我需要替换/删除这些字符串中的4字节序列。
我正在寻找一种干净的方式来替换这些字符。
Apache库正在用问号替换字符,这对于这种情况来说很好,尽管ASCII等效物当然会更好。
注意:贝输入来自外部源(电子邮件名称),此时升级数据库不是解决方案。
由于MySQL 5.1不支持4字节UTF-8序列,因此我需要替换/删除这些字符串中的4字节序列。
我正在寻找一种干净的方式来替换这些字符。
Apache库正在用问号替换字符,这对于这种情况来说很好,尽管ASCII等效物当然会更好。
注意:贝输入来自外部源(电子邮件名称),此时升级数据库不是解决方案。
我们最终在Java中实现了以下方法来解决这个问题。基本上,用更高的码位替换字符,然后是最后一个3字节的UTF-8字符。
偏移量计算是为了确保我们保持在 unicode 码位上。
public static final String LAST_3_BYTE_UTF_CHAR = "\uFFFF";
public static final String REPLACEMENT_CHAR = "\uFFFD";
public static String toValid3ByteUTF8String(String s) {
final int length = s.length();
StringBuilder b = new StringBuilder(length);
for (int offset = 0; offset < length; ) {
final int codepoint = s.codePointAt(offset);
// do something with the codepoint
if (codepoint > CharUtils.LAST_3_BYTE_UTF_CHAR.codePointAt(0)) {
b.append(CharUtils.REPLACEMENT_CHAR);
} else {
if (Character.isValidCodePoint(codepoint)) {
b.appendCodePoint(codepoint);
} else {
b.append(CharUtils.REPLACEMENT_CHAR);
}
}
offset += Character.charCount(codepoint);
}
return b.toString();
}
另一个简单的解决方案是 使用正则表达式 。例如在java中:[^\u0000-\uFFFF]
text.replaceAll("[^\\u0000-\\uFFFF]", "\uFFFD");