我们有旧的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