限制中文输入是英文输入长度的一半

在限制输入长度的时候可能会有这样的一个需求:输入的中文长度得是英文长度的一半。也就是说一个输入框你可以输入20个英文字符,但是只能输入10个中文汉字或其他字符。

之前的思路是利用正则判断汉字的Unicode编码[\u4e00-\u9fa5],首先正则的性能不是很好,其次如果是emoji表情,长度是按照英文字符还是中文字符判断呢?
偶然的机会看到一个方法使用charCodeAt()判断Unicode编码表中对应的整数,这样返回的结果是0-65535之间的整数(现在Unicode对应的整数已经达到了65536-1114111),一般65535之后的字符大多是emoji表情,比如:比如 ? 是 127850(1F36A)。

我们需要判断的英文字符对应的数字在0-127之间,也就是我们听说的ASCII编码,
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)。

整体思路是这样的:定义一个变量代表字符权重,0-127权重为1,此后的权重均为2;判断单个字符的Unicode编码,增加对应的权重,控制权重在最大的范围内,例如文章一开始说的想限制20个英文字符,10个中文字符,在输入英文字符的时候就+1,输入中文的字符就+2,最后不能超过20。

上代码

/**
* 获取字符串长度
*/
getStrFullLength=(str='')=>{
	str.split('').reduce((pre,cur)=>{
		const charCode=cur.charCodeAt(0)
		if(charCode>=0 && charCode<=127){
			return pre + 1
		}
		return pre + 2
	})
}

/**
* 截取字符串
*/
cutStrByFullLength=(str='',maxLength) =>{
	let showLength=0;
	return str.split('').reduce((pre,cur)=>{
		const charCode=cur.charCodeAt(0);
		if(charCode>=0&&charCode<=127){
			showLength+=1
		}else{
			showLength+=2
		}
		if(showLength<=maxLength){
			return pre+cur
		}
		return pre
	},'')
}

参考文章:
谈谈字符编码:Unicode、UTF-8 和 char[] https://luan.ma/post/character-encoding/
ASCII编码:https://baike.baidu.com/item/ASCII/309296?fr=aladdin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值