如何在Java中替换/删除UTF-8字符串中的4(+)字节字符?

pvg*_*ijn 18 java mysql utf-8

因为MySQL 5.1不支持4字节UTF-8序列,所以我需要替换/删除这些字符串中的4字节序列.

我正在寻找一种干净的方法来替换这些角色.

在这种情况下,Apache库正在用问号替换字符,但是当然,ASCII等价物会更好.

NB输入来自外部源(电子邮件名称),此时升级数据库不是解决方案.

pvg*_*ijn 11

我们最终在Java中为此问题实现了以下方法.Basicaly用更高的代码点替换字符,然后用最后的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();
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我用它来避免转换我的整个MySQL字符集.我的数据中不需要外星人角色或便便角色. (2认同)

sla*_*wek 10

另一种简单的解决方案是使用正则表达式[^\u0000-\uFFFF].例如在java中:

text.replaceAll("[^\\u0000-\\uFFFF]", "\uFFFD");
Run Code Online (Sandbox Code Playgroud)