案例1:一般的正则表达式的校验unicode编码范围有:4E00-9FA5,用这个来校验,但是这个只能校验基本的汉字,但对于生僻字的校验是不通过的。
在做项目对的时候用到校验的姓名的,我使用了4E00-9FA5这个范围进行校验,基本的汉字是可以校验通过的,但是遇到一些生僻字就校验不通过。
查找了很多关于unicode编码的资料,了解了中文的范围有好多种。
𪜞𪜟这个生僻字使用上面的unicode编码校验是不通过的,因为它们不在那个范围,它们在的unicode范围:2A700-2B734,但js只能识别2字节的编码,这个超过了2个字节,直接使用这个范围做正则校验是不通过的,
长话短说,我直接将我查资料的网站丢在这,大家自行学习。
汉字unicode编码:https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php
四字节的unicode编码:http://www.ruanyifeng.com/blog/2014/12/unicode.html
这是校验汉字包含生僻字的js函数。
function utf8ToUtf16(h, l) {
var sum = ((h - 0xD800) * 0x400 + (l - 0xDC00)) + 0x10000;
return sum;
};
function checkCode(val, maxLen) {
var len = val.length;
var lenRel = len;
var i = 0;
while (i < len) {
var h = val.charCodeAt(i); i++;
if ((h >= 0x3400 && h <= 0x4DB5) || (h >= 0x4E00 && h <= 0x9FA5) || (h >= 0xF900 && h <= 0xFAD9) || (h >= 0x2F00 && h <= 0x2FD5) || (h >= 0x3400 && h <= 0x4DB5)) {}
else
if (h >= 0xD800 && h <= 0xDBFF) {
var l = val.charCodeAt(i); i++;
lenRel--;
var utf16 = utf8ToUtf16(h, l);
if (! (utf16 >= 0x20000 && utf16 <= 0x2A6D6) && !(utf16 >= 0x2A700 && utf16 <= 0x2B734) && !(utf16 >= 0x2B740 && utf16 <= 0x2B81D) && !(utf16 >= 0x2F800 && utf16 <= 0x2FA1D) && !(utf16 >= 0x30000 && utf16 <= 0x3134A) && !(utf16 >= 0x2B820 && utf16 <= 0x2CEA1) && !(utf16 >= 0x2CEB0 && utf16 <= 0x2EBE0)) {
return false;
}
} else {
return false;
}
}
return lenRel >= maxLen;
};
checkCode(arg2, 2)
1、checkCode(“姓名”,2);校验姓名是否是汉字。该方法返回true,
2、checkCode(“1223”,2),返回false,表示不是汉字,
3、checkCode函数的第二参数2是表示校验的arg2的长度,姓名要满足2位 及2位以上。