字符过滤
需求
一个运行多年的客户端程序,使用的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