检查如果一个字符串是MySQL UTF-8兼容(Checking if a string is UT

2019-10-19 08:58发布

我们有旧的MySQL数据库只支持UTF-8字符集。 是一个有Java中的方法来检测,如果给定的字符串将是UTF-8兼容?

Answer 1:

public static boolean isUTF8MB4(String s) {
    for (int i = 0; i < s.length(); ++i) {
        int bytes = s.substring(i, i + 1).getBytes(StandardCharsets.UTF_8);
        if (bytes > 3) {
            return true;
        }
    }
    return false;
}

上面的实现似乎最好的,但在其他方面:

public static boolean isUTF8MB4(String s) {
    for (int i = 0; i < s.length(); ) {
        int codePoint = s.codePointAt(i);
        int bytes = Character.charCount(codePoint);
        if (bytes > 3) {
            return true;
        }
        i += bytes;
    }
    return false;
}

这可能更容易发生故障。



Answer 2:

每个字符串是UTF-8兼容。 只需设置数据库和正确的MySQL驱动程序编码和你设置。

唯一的疑难杂症的是,在UTF-8编码的字符串的字节长度可以更大什么.length()表示。 这里是一个Java实现的功能来衡量一个字符串多少字节编码需要为UTF-8之后。

编辑:既然Saqib指出,旧的MySQL实际上并不支持UTF-8,而只是它的子集BMP,您可以检查是否字符串包含BMP之外的代码点与string.length()==string.codePointCount(0,string.length()) “真”的意思是“所有编码点是在BMP”),并与删除它们string.replaceAll("[^\u0000-\uffff]", "")



Answer 3:

MySQL的定义 :

命名为UTF8字符集最多使用的每个字符三个字节,并且只包含BMP字符。

因此,该功能应该工作:

private boolean isValidUTF8(final String string) {
    for (int i = 0; i < string.length(); i++) {
        final char c = string.charAt(i);
        if (!Character.isBmpCodePoint(c)) {
            return false;
        }
    }
    return true;
 }


文章来源: Checking if a string is UTF-8 compatible for mySQL