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/

目录
相关文章
|
6月前
|
机器学习/深度学习 传感器 编解码
人机融合智能 | 脑机接口和脑机融合
脑机接口是一种在大脑与外部设备间建立直接信息交流的技术,能实现意念控制设备或对大脑进行调控。脑机融合则进一步将生物脑与机器智能结合,推动人机协同交互。本文介绍了脑机接口的技术框架、信号采集与解码方法,并探讨其在医疗康复、人机交互等领域的应用前景及挑战。
346 0
|
Java Spring
如何通过IDEA查看注解逻辑实现
如何通过IDEA查看注解逻辑实现
1411 0
|
存储 NoSQL Java
mongodb基于地理位置查询实现围栏
mongodb基于地理位置查询实现围栏
1837 0
|
XML 数据格式
mybaties xml 判断集合是否size大于0
在xml文件中用foreach遍历集合
326 0
|
存储 消息中间件 缓存
计算机底层原理概述
计算机底层原理概述
计算机底层原理概述
|
固态存储 计算机视觉
【24】目标检测模型SSD的搭建及其训练与测试
【24】目标检测模型SSD的搭建及其训练与测试
513 0
【24】目标检测模型SSD的搭建及其训练与测试
|
存储 机器学习/深度学习 数据建模
【数据结构】图的存储结构—邻接矩阵
【数据结构】图的存储结构—邻接矩阵
1789 0
【数据结构】图的存储结构—邻接矩阵
|
机器学习/深度学习 数据采集 算法
数据挖掘实战:个人信贷违约预测(上)
大家好,我是东哥。本次分享一个数据挖掘实战项目:个人信贷违约预测,此项目对于想要学习信贷风控模型的同学非常有帮助,数据和源码在文末。
1081 0
数据挖掘实战:个人信贷违约预测(上)
|
存储 NoSQL Unix
【开源项目】C语言开源项目一览
【开源项目】C语言开源项目一览
642 0
|
存储 移动开发 小程序
SoloPi:支付宝 Android 专项测试工具 | 开源
近年来,随着移动互联网的蓬勃发展,移动测试技术也取得了长足的进步,从早期基于测试脚本的单机自动化,到录制回放、图像识别、云测平台等测试技术贴合实际业务需求深度应用和创新,测试效率从而一次又一次被提升。
2127 0
SoloPi:支付宝 Android 专项测试工具 | 开源