我们有较旧的mySQL DB,只支持UTF-8字符集。在Java中是否有办法检测给定字符串是否与UTF-8兼容?
答案 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;
}