含生僻字中文校验方式优化

文章讲述了在Java中处理Unicode生僻字时遇到的问题,原有的UTF8正则校验无法覆盖双码字的生僻字。Unicode标准允许最多111万个字符,包括增补字符。Java使用UTF-16编码,增补字符由高代理和低代理对表示。解决方案涉及检查字符是否为高代理和低代理组合,以及使用Character.UnicodeBlock进行字符类型的判断和校验。

项目姓名校验原本一直是通过utf8正则进行校验,但近期出现的客户生僻字包含双码字,原有校验方式无法实现。需要修改扩大校验范围。

知识点回顾:
Unicode是Unicode Standard(Unicode标准)的简写;Unicode为每一字符提供一个数字编号,通俗讲,就是字符集(coded charset);U+[XX]XXXX是码点的表示形式,X代表一个十六制数字,可以有4-6个,不足4个前补0补足4个。示例:U+0048,U+4F60,U+1D11E。最后一个是5个16进制数的码点。取值范围:U+0000~U+10FFFF(10FFFF+1=1114112,一般记为111万左右),也就是Unicode可以支持111万个字符;
Unicode平面
码点的全部范围可以均分成17个65536大小的部分,这里面的每一个部分就是一个平面(Plane),其实就是不同的取值范围。编号从0开始,第一个平面称为Plane 0.第一个平面即是BMP(Basic Multilingual Plane 基本多语言平面),也叫Plane 0,它的码点范围是U+0000~U+FFFF。这也是我们最常用的平面,日常用到的字符绝大多数都落在这个平面内。
CJK统一汉字
在Unicode中,称为CJK统一汉字(CJK:Chinese, Japanese, and Korean,中日韩)。位于平面0;可以在word里面查询到CJK对应的Unicode编码.

问题调研:
使用正则表达式[\u4E00-\u9FA5]来匹配中文的问题在哪?
这一段大小不过是两万多一点,\u4E00-\u9FA5(19968-40869,4E00就是“一“字。),严格来说这只是Unicode最主要的一段中文区域。不过对于绝大数情况够用了。

而本次涉及的生僻字,\uD852\uDFE5,由两个unicode码点组成,以原有方式单一匹配无法实现校验。这类生僻字字符其实被称为增补字符,Unicode本身码空间为U+0000到U+10FFFF,一共1114112个码位,U+10000及以上的字符称为增补字符。在Java中(Java1.5之后),增补字符使用两个char型变量来表示。第一个char型变量的
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值