ThinkSNS+如何计算字符显示长度?【社交系统研发日记五】
来源:互联网 发布:广州祺曜互娱 知乎 编辑:程序博客网 时间:2024/06/08 09:09
今天我们来聊一下可能很多人都会头疼的东西:显示长度。
需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度。如下:
上面排的是两个英文字母,一个汉字,一个Emoji。你会发现,在显示上占的宽度是一致的。一些设计上为了好看也要求有这样的处理。
例如,我们的用户名需求是最多12个非单字节字符或者24个单字节字符的需求也可以混合排的需求,我们写后端不得不处理这样的验证了。
需求规则是 /^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/
在ThinkSNS+中,为了能把这部分验证公用,所以选择使用自定义验证规则。我们先说下计算的实现思路吧!
首先,就算是mb_strlen也没法准确的获取多字节字符和单子节字符混合在一起的长度,网上有个说法,汉字占三个字节,英文数组半角符号占一个字节,所以:
用这个方法可以得到单字节占0.5多字节占1的计算。但是以中文为例,只有两万个汉字才是这种情况,还有六万多汉字是四个,其次,emoji也是四个字节。根本无法准确的计算。
好在在无意间发现一个奇怪的东西str_word_count 这个函数计算非英文单词外是除了符号例如中文就是按照汉字个数算的,emoji也是同理。
发现这个以后,咱们就好办了。我们吧用户名中的 [a-aA-Z0-9_] 剔除掉,单独计算不就是我们要的验证长度了吗?
所以,首先我们用:
方式单独计算出单字节字符的显示长度,再用:
方式计算出多字节的长度,最后:
就得出了显示长度,实现了,最后封装成验证规则:
代码是原型代码,还没有进行优化,之后我们只要按照下面的方式用:
现在就很好的解决了这个需求。
我们很乐意,将基于 Laravel 的 ThinkSNS+ 产品开发中的技术解决方案分享给大家,也希望喜欢的朋友能给国内开源产品一点点的支持。
【开源代码仓库】
GitHub:https://github.com/zhiyicx/thinksns-plus(点击star,每日关注开发动态。)
咨询QQ:3298713109
社交系统ThinkSNS官网:http://www.thinksns.com/
开源不易,为了争取开源,我们团队做了很多努力。把基于Laravel的作品展示在大家面前,之后专栏会持续不断的分享ThinkSNS +开发过程中的技术细节。
- ThinkSNS+如何计算字符显示长度?【社交系统研发日记五】
- 社交系统ThinkSNS+研发日记四:如何做到 Laravel 配置可以网站后台配置
- 不使用三方包时,如何在社交系统ThinkSNS中建立优雅的用户权限管理【研发日记13】
- 社交系统ThinkSNS+ 0.7.3研发播报
- 基于 Laravel Route 的 社交系统ThinkSNS+ Component【研发日记三】
- 社交系统ThinkSNS+ alpha.2 版本发布,快来看看都有些什么【研发日记六】
- 【社交系统ThinkSNS研发日记十二】Laravel Model 利用 Macroable 为数据模型添加宏能力
- 社交系统ThinkSNS+ 0.7.4最新研发播报
- 社交系统ThinkSNS-plus(TS+)iOS端APP V1.0.2研发播报
- 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能 !
- 社交系统/社群系统ThinkSNS+更新播报!
- 开源社交系统ThinkSNS+ 发布通知!
- 社交系统ThinkSNS+预售活动结束倒计时
- 社交系统ThinkSNS V4更新播报
- 简析SNS社交系统ThinkSNS适用的行业!
- 基于 Laravel、Vue.js开发的全新社交系统----ThinkSNS+
- 开源SNS社交系统ThinkSNS+安装部署演示视频!
- 社交系统ThinkSNS+ 更新至V0.8.2,新增圈子功能
- springMvc实现处理多个input的表单对象封装name到对象
- python2.7 安装numpy no module name zlib
- Spring ModelAttribute注解
- hive 常用sql
- 使用 Node.js 对文本内容分词和关键词抽取
- ThinkSNS+如何计算字符显示长度?【社交系统研发日记五】
- Computed 、 Methods、Watchers
- MVC与三层架构
- spring事务
- JDK内置工具使用
- C++学习中遇到的问题
- (个人)AR电子书创新系统实训第三周(2)
- PHP扩展开发(二)
- js跳转到新页面传参以及接收参数的方法