检查UTF-8数据类型3字节或4字节Unicode

aku*_*zma 8 java mysql unicode utf-8 character-encoding

在我的数据库中,我收到错误

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column
Run Code Online (Sandbox Code Playgroud)

我使用Java和MySQL 5.我知道4字节Unicode是合法的Java,但在MySQL 5中是非法的,我认为它可能导致我的问题,我想检查我的数据类型,所以这里是我的问题:怎么能我检查我的UTF-8数据是3字节还是4字节Unicode?

Jon*_*eet 17

UTF-8以1-3个字节对基本多语言平面中的所有内容(即U + 0000到U + FFFF)进行编码.因此,你只需要检查一切都在你的串是否在BMP.

在Java中,这意味着检查是否有任何char(UTF-16代码单元)是高或低代理字符,因为Java将使用代理对来编码非BMP字符:

public static boolean isEntirelyInBasicMultilingualPlane(String text) {
    for (int i = 0; i < text.length(); i++) {
        if (Character.isSurrogate(text.charAt(i))) {
            return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)


Esa*_*ija 10

如果你不想支持BMP之外,你可以在将它们交给MySQL之前删除这些字符:

public static String withNonBmpStripped( String input ) {
    if( input == null ) throw new IllegalArgumentException("input");
    return input.replaceAll("[^\\u0000-\\uFFFF]", "");
}
Run Code Online (Sandbox Code Playgroud)

如果你想支持BMP以外,你需要的MySQL 5.5+,你需要改变一切,这是utf8utf8mb4(排序规则,字符集...).但是你也需要我不熟悉的驱动程序中的支持.在Java中处理这些字符也很痛苦,因为它们分布在2上chars ,因此需要在许多操作中进行特殊处理.


ver*_*lor 6

发现在 Java 中去除非 BMP 字符的最佳方法如下:

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