utf8字符串筛选3个字节

utf8字符串筛选3个字节

需求场景

springboots web+mysql数据库,项目中,前后端联调过程中,发现如果前端录入表情符号等超过3个字节的utf8字符串后,由于mysql的存储格式为utf8格式,存储最大为3个字节,因此报异常。

解决方法:
1、找到超过3个字节的表情以及其他字符,逐一筛选
2、通过判断utf8的每个字符的字节数来筛选
3、mysql数据库修改为utf8mb4格式,扩大存储字节

分析:
1方法经过讨论,很难确认手机或者前端使用的是什么输入法,因此这个utf8筛选范围很难确认。
2方法直接使使用字节的方式进行筛选,可以很好的避免数据库存储异常问题。
3方法直接扩大数据库存储空间,会带来一定的资源浪费,牵连比较多。

因此选择2作为实施方案。

utf8介绍

最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

实现

/**
 * @Description: 看该字符串的utf8格式,是否都是3个字节(包含)以内的,如果有超出,那么返回false
 * @Author: Gong Yongwei
 * @Date: 2018/12/4 9:37
 * @param str
 * @return: boolean 都是三个字节:true,有超出的返回false
 */ 
public static boolean isAllThreeByte(String str) {
    if(str == null || str.equals(""))
        return true;

    byte[] utf8Byte = str.getBytes(Charset.forName("utf-8"));
    for (byte b : utf8Byte) {
        if ((byte) (b & 0xf0) == (byte) 0xf0)
            return false;
    }
    return true;
}

通过以上函数可以很好的进行筛选超过3个字节的utf8字符串,前后端通用。解决需求问题。

扩展

通过以上实现,我们以后碰到utf8字节数相关的问题,也可以扩展它的utf8Util来解决。

猜你喜欢

转载自blog.csdn.net/weixin_37924923/article/details/84982591
今日推荐