检查字符串是否与mySQL UTF-8兼容

时间:2014-02-18 21:51:44

标签: java mysql string utf-8 character-encoding

我们有较旧的mySQL DB,只支持UTF-8字符集。在Java中是否有办法检测给定字符串是否与UTF-8兼容?

3 个答案:

答案 0 :(得分: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;
}

可能会更频繁地失败。

答案 1 :(得分:0)

每个字符串都与UTF-8兼容。只需在数据库和MySQL驱动程序中正确设置编码即可设置。

唯一的问题是UTF-8编码字符串的字节长度可能比.length()所说的大。 Here's a Java implementation of a function to measure how many bytes a string will take after encoding to UTF-8.

编辑:由于Saqib指出较旧的MySQL实际上不支持UTF-8,而只支持其BMP子集,因此您可以检查字符串是否包含带有string.length()==string.codePointCount(0,string.length())的BMP外的代码点(“true”表示“全部”代码点位于BMP“)中,并使用string.replaceAll("[^\u0000-\uffff]", "")

删除它们

答案 2 :(得分:0)

MySQL defines

  

名为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;
 }