有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java检查UTF8数据类型3字节或4字节Unicode

在我的数据库中,我得到了错误

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column

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


共 (3) 个答案

  1. # 1 楼答案

    在java中去除Ifound的非BMP字符的最佳方法如下:

    inputString.replaceAll("[^\\u0000-\\uFFFF]", "\uFFFD");
    
  2. # 2 楼答案

    UTF-8将基本多语言平面中的所有内容(即U+0000到U+FFFF)编码为1-3字节。因此,您只需要检查字符串中的所有内容是否都在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;
    }
    
  3. # 3 楼答案

    如果不想支持beyond BMP,可以在将其交给MySQL之前去掉这些字符:

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

    如果你想支持BMP之外的东西,你需要MySQL 5.5+并且你需要改变一切utf8utf8mb4(排序规则、字符集…)。但你也需要我这个司机的支持 不熟悉。在Java中处理这些字符也是一件痛苦的事情,因为它们分布在2chars 因此在许多操作中需要特殊处理