ThinkSNS+ 如何计算字符显示长度

简介:

今天我们来聊一下可能很多人都会头疼的东西:显示长度。

需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度。如下:

_1

上面排的是两个英文字母,一个汉字,一个Emoji。你会发现,在显示上占的宽度是一致的。一些设计上为了好看也要求有这样的处理。

例如,我们的用户名需求是最多12个非单字节字符或者24个单字节字符的需求也可以混合排的需求,我们写后端不得不处理这样的验证了。

需求规则是 /^a-zA-Z_x7f-xff*$/

在ThinkSNS+中,为了能把这部分验证公用,所以选择使用自定义验证规则。我们先说下计算的实现思路吧!

首先,就算是mb_strlen也没法准确的获取多字节字符和单子节字符混合在一起的长度,网上有个说法,汉字占三个字节,英文数组半角符号占一个字节,所以:

_2

用这个方法可以得到单字节占0.5多字节占1的计算。但是以中文为例,只有两万个汉字才是这种情况,还有六万多汉字是四个,其次,emoji也是四个字节。根本无法准确的计算。

好在在无意间发现一个奇怪的东西str_word_count 这个函数计算非英文单词外是除了符号例如中文就是按照汉字个数算的,emoji也是同理。

发现这个以后,咱们就好办了。我们吧用户名中的 [a-aA-Z0-9_] 剔除掉,单独计算不就是我们要的验证长度了吗?

所以,首先我们用:

_3

方式单独计算出单字节字符的显示长度,再用:

_4

方式计算出多字节的长度,最后:

_5

就得出了显示长度,实现了,最后封装成验证规则:

_6

代码是原型代码,还没有进行优化,之后我们只要按照下面的方式用:

_7

现在就很好的解决了这个需求。

我们很乐意,将基于 Laravel 的 ThinkSNS+ 产品开发中的技术解决方案分享给大家,也希望喜欢的朋友能给国内开源产品一点点的支持。

开源代码仓库:

GitHub:https://github.com/zhiyicx/thinksns-plus(点击star,每日关注开发动态。)
官网:http://www.thinksns.com/

目录
相关文章
|
Java Spring
如何通过IDEA查看注解逻辑实现
如何通过IDEA查看注解逻辑实现
1227 0
|
Java API
Java时间格式字符串与Date的相互转化
Java时间格式字符串与Date的相互转化
821 0
|
Java 数据格式 Spring
一文全面深入了解Spring中的@Value注解
一文全面深入了解Spring中的@Value注解
2775 0
一文全面深入了解Spring中的@Value注解
|
JSON 前端开发 Java
SpringBoot中jackson日期格式化问题(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS not turning off timestamps)
SpringBoot中jackson日期格式化问题(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS not turning off timestamps)
479 0
|
存储 NoSQL Java
mongodb基于地理位置查询实现围栏
mongodb基于地理位置查询实现围栏
1749 0
|
JSON 前端开发 Java
Spring Validation参数效验各种使用姿势
在日常的项目开发中,为了防止非法参数对业务造成的影响,需要对接口的参数做合法性校验,例如在创建用户时,需要效验用户的账号名称不能输入中文与特殊字符,手机号、邮箱格式是否准确。
5302 7
|
XML 数据格式
mybaties xml 判断集合是否size大于0
在xml文件中用foreach遍历集合
309 0
|
存储 消息中间件 缓存
计算机底层原理概述
计算机底层原理概述
计算机底层原理概述
|
JSON 前端开发 Java
spring boot全局日期格式化配置
spring boot全局日期格式化配置
1237 0
|
固态存储 计算机视觉
【24】目标检测模型SSD的搭建及其训练与测试
【24】目标检测模型SSD的搭建及其训练与测试
439 0
【24】目标检测模型SSD的搭建及其训练与测试