字符过滤

编程

需求

一个运行多年的客户端程序,使用的mysql数据库,utf8mb3编码格式。新通道下发数据到其数据库,无法保存utf8四字节字符或表情,导致报错。客户端连接各种设备,设备可能不支持四字节字符,需要过滤掉四字节字符。

过滤方式

mysql utf8mb3 支持三字节及以内的字符,云端过滤四字节字符。过滤方式这是比较值得思考的。

  • Unicode 及 UTF8 概念

    总结的比较好的一篇 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

    简单理解是:Unicode 是符号集,例如 U+4E25 表示汉字 ”严“,其并没有如何存储计算机中;UTF-8是编码方式,将Unicode的符号对应成计算机存储。

    对应关系

Unicode符号范围     |        UTF-8编码方式

(十六进制) | (二进制)

--------------------+---------------------------------------------

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

  • Java 中的 char 类型
  • char 范围 0 - 65535 共65536个符号
  • 查看 char 可以表示出的字符

        int currentLength = 0;

for(int i =0; i<=65535; i++){

String val = new String(new char[]{(char)i});

byte[] charByte = val.getBytes("UTF-8");

if(currentLength == charByte.length){

System.out.print((char)i);

} else {

currentLength = charByte.length;

System.out.println();

System.out.println("字节长度:"+currentLength + "===========================================");

System.out.println((char)i);

}

}

  • 打印后发现没有四字节字符,都在三字节之内
  • 那么四字节是如何正确传输的呢?因为java没解析四字节

        String smile = "uD83EuDD29";

System.out.println(smile.length());

  • 按照上面代码判断字符个数就会有问题了,一个可视字符判断成两个
  • 判断字符字节数

        String val = new String("uD83EuDD29");

byte[] charByte = val.getBytes("UTF-8");

byte tt = charByte[0];

if (CharUtils.isAscii((char) tt)) {

System.out.println("1个字节字符为:" + val);

} else if ((tt & 0xE0) == 0xC0) {

System.out.println("2个字节字符为:" + val);

} else if ((tt & 0xF0) == 0xE0) {

System.out.println("3个字节字符为:" + val);

} else if ((tt & 0xF8) == 0xF0) {

System.out.println("4个字节字符为:" + val);

}

  • 正则中有 u 指定字符 u0000 - uFFFF 范围 16 * 16 * 16 * 16 = 65535 即使用此可以过滤出常用字符
  • 注意使用方式

"uD83EuDD29".replaceAll("[\u0000-\uFFFF]",""); //?

  • java 中的 Pattern 可以完成一些个性化过滤处理

相关文档

  • https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum
  • https://www.zhihu.com/question/23374078
  • https://www.utf8-chartable.de/unicode-utf8-table.pl?number=1024
  • http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
  • http://www.regexlab.com/zh/regref.htm

以上是 字符过滤 的全部内容, 来源链接: utcz.com/z/517791.html

回到顶部