设置字符白名单 - 中文在 Uniccode 的范围,以及 中文转成int后的范围

今天在解决系统安全漏洞及代码安全漏洞。需要设置一个允许输入的字符白名单。

因为用户可以输入 中文、大写英文、小写英文、数字、以及常规字符。

有些资料内查询的中文在 unicode编码 范围为:\u4E00-\u9FA5  这个范围为基本汉字。(文末附更多中文字符集)

\u4E00  这个怎么看,以前没有具体看过,今天分析了一下豁然开朗,原来这么简单。 

unicode百度百科

\u4E00  分为两部分  \u  和 4E00  

\u 为 unicode编码的意思

4E00  是十六进制数

可以将十六进制通过工具转换成10进制        在线进制转换工具

4E00转换为十进制为:19968

9FA5转换为十进制为:40869

换句话说基本中文转成十进制范围19968-40869

可以自己写个main方法测试一下、

一:将unicode编码 \u4E00 通过工具转成中文得到的是“一”。            Unicode在线转换工具

二:写个main方法将十进制19968转换成char输出。输出的也是 “一”

三:通过以上方法即可将中文在unicode编码的范围,转成在数值中的范围,这样就得到了中文转成数值后的范围了。

	public static void main(String[] args) {
		System.out.println("数值的19968对应的char="+(char)19968);
	}

所以根据以上内容自己写了一个白名单过滤字符串工具类。

package cdb.hq.litsoft.bjyl.connector.util;

public class StringWhiteList {
	public static String cleanString(String aStr){
		if(aStr==null) return null;
		String cleanString="";
		for(int i=0;i<aStr.length();i++){
			cleanString+=cleanChar(aStr.charAt(i));
		}
		return cleanString;
	}

	public static char cleanChar(char aChar) {
		// 0-9
		for(int i=48;i<=57;i++){
			if(aChar==i){return (char)i;}
		}
		// 'A'-'Z'
		for(int i=65;i<=90;i++){
			if(aChar==i){return (char)i;}
		}
		// 'a'-'z'
		for(int i=97;i<=122;i++){
			if(aChar==i){return (char)i;}
		}
		// 中文
		for(int i=19968;i<=40879;i++){
			if(aChar==i){System.out.println((char)i+"对应的int值="+i);return (char)i;}
		}
		//特殊字符
		switch (aChar) {
			case '/':return '/';
			case '.':return '.';
			case '-':return '-';
			case '_':return '_';
			case ' ':return ' ';
		}
		return '%';
	}
	
	public static void main(String[] args) {
		System.out.println(StringWhiteList.cleanString("0Aa中文/.-_ "));
		System.out.println(StringWhiteList.cleanString("0Aa中文/.-_ !??"));
		System.out.println("符号!对应的int="+(int)'!');
		System.out.println("符号?对应的int="+(int)'?');
		System.out.println("int的19968对应的char="+(char)19968);
		System.out.println("int的40879对应的char="+(char)40879);
	}
}

 

中文在unicode编码中的范围如下:

字符集字数Unicode 编码
基本汉字20902字4E00-9FA5
基本汉字补充74字9FA6-9FEF
扩展A6582字3400-4DB5
扩展B42711字20000-2A6D6
扩展C4149字2A700-2B734
扩展D222字2B740-2B81D
扩展E5762字2B820-2CEA1
扩展F7473字2CEB0-2EBE0
扩展G4939字30000-3134A
康熙部首214字2F00-2FD5
部首扩展115字2E80-2EF3
兼容汉字477字F900-FAD9
兼容扩展542字2F800-2FA1D
PUA(GBK)部件81字E815-E86F
部件扩展452字E400-E5E8
PUA增补207字E600-E6CF
汉字笔画36字31C0-31E3
汉字结构12字2FF0-2FFB
汉语注音43字3105-312F
注音扩展22字31A0-31BA
1字3007

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

songfelicity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值