当前位置: 首页 > news >正文

Unity 如何优雅的限定文本长度, 包含对特殊字符,汉字,数字的处理。实际的案例包括 用户昵称

常规限定文本长度 ( 通过 UntiyEngine.UI.Inputfiled 附带的长度限定 )

在这里插入图片描述

痛点1

无法对中文,数字,英文进行识别,同样数量的汉字和同样数量的英文像素长度是不一样的,当我们限定固定长度后,在界面上的排版不够美观

在这里插入图片描述
在这里插入图片描述

痛点2

当我们需要对用户的名称加限制长度的时候, 不同的文本( 汉字,字母,数字,符号 ) 外观上长度不一,常规的裁切不够优雅,文本看上去也是突然的停顿了,比如中间的 “巴拉巴拉小魔仙”, “仙” 直接裁切了,处理方式太过僵硬

当然,我们可以用自动适配来缩小字体来解决以上问题,但整体看上去又不够整齐,很容易出现大小层次不齐,整体看上去会很丑
在这里插入图片描述

如何解决呢?

第一个痛点,我们可以通过像素的方式,以单元格的方式去计算文本实际长度, 而非固定长度限制

如: 你好,世界! 占用的是10个单元格
而:hello,world 占用的是10个单元格

如上,虽然字符串长度不一样,但是实际像素却是一样的 ( 这里我们做一个设定, 不足一个字母长度的当成一个字母长度, 如 !, ., _,-, 这些都是字母,但长度不一,我们按最大长度来处理,也就是一个英文字母 A的长度来设定 )

如何去判断字符串中有多少个汉字,多少个特殊字符呢? 我们需要写一个正则表达式来筛选,这里我封装了一个类,来专门处理

这里,我额外处理,日文,韩文,这些长度都是等同于汉字的处理, 具体长度计算 我们只需要调用 GetTextSize 方法
大家也可以自行扩展,根据实际项目中的字体去更改大小比例,有的项目中 英文和汉字的比例是 1:1.5, 我本人的项目字体目前是1:2 所以
文本中汉字的实际大小 = 字符串包含汉字的数量x2

using System.Text.RegularExpressions;public class LanguageCounter
{// 统计字符串中的中文字符个数public static int CountChinese( string input ){return Regex.Matches( input, @"[\u4e00-\u9fff]" ).Count;}// 统计字符串中的英文字符个数public static int CountEnglish( string input ){return Regex.Matches( input, @"[a-zA-Z]" ).Count;}// 统计字符串中的符号个数(包括标点、特殊符号等)public static int CountSymbols( string input ){return Regex.Matches( input, @"[^\u4e00-\u9fff\w\s]" ).Count;}// 统计字符串中的数字个数public static int CountNumbers( string input ){return Regex.Matches( input, @"\d" ).Count;}// 统计字符串中的韩文字符个数public static int CountKorean( string input ){return Regex.Matches( input, @"[\uac00-\ud7af]" ).Count;}// 统计字符串中的日文字符个数public static int CountJapanese( string input ){return Regex.Matches( input, @"[\u3040-\u30ff]" ).Count;}// 空格数量public static int CountSpace( string input ){return Regex.Matches( input, @"\s" ).Count;}/// <summary>/// 获取字符串中 单元大小/// /// 字符/字母/数字 按一个单元算/// 中文汉字,韩文,繁体,日文,片甲 按两个单元算/// /// </summary>/// <param name="text"></param>/// <returns></returns>public static int GetTextSize( string text ){int chineseSize = LanguageCounter.CountChinese( text ) * 2;int japaneseSize = LanguageCounter.CountJapanese( text ) * 2;int koreaneseSize = LanguageCounter.CountKorean( text ) * 2;int englisheseSize = LanguageCounter.CountEnglish( text );int symbolsSize = LanguageCounter.CountSymbols( text );int numberSize = LanguageCounter.CountNumbers( text );int spaceSize = LanguageCounter.CountSpace( text );return spaceSize + chineseSize + englisheseSize + symbolsSize + numberSize + japaneseSize + koreaneseSize;}}

如何解决第二个痛点呢?

我们只需要限定长度,这个长度是实际单元像素长度,而非固定字符串长度去处理就行,尾号加上 就可以完美解决

 public void SetName( string newName ){if ( LanguageCounter.GetTextSize( newName ) > 12 ){//这里,因为你永远也不知道尾部的字符是  汉字,韩语,  特殊符号, 还是字母和数字,所以我们只需要遍历去裁切计算长度就可以了//至于性能,这里不涉及UI,仅仅对数据进行遍历,开销可以忽略不记while ( LanguageCounter.GetTextSize( newName ) > 9 ){newName = newName.Remove( newName.Length - 1 );}newName = newName + "...";}//在最后我们将筛好的字符串赋值给 UI 就大功告成了nameText.text = newName;}

最后,感谢大家阅读,有什么问题,可以通过博客私聊我,或者你有更好的方法也可以在博客下留言,感谢!

http://www.lryc.cn/news/482689.html

相关文章:

  • SMO+PLL滑膜观测器、MARS模型参考自适应观测器simulink仿真
  • 例题解析:利用异或运算(XOR)找出单独的数
  • 如何处理微信小程序大量未捕获的异常
  • C#-StringBuilder
  • SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
  • linux安装zookeeper和kafka集群
  • 洞悉 Linux 系统运行细节,使用 atop 监测和回看系统负载状态
  • “双十一”电商狂欢进行时,在AI的加持下看网易云信IM、RTC如何助力商家!
  • Python调用企业微信的扫一扫
  • 速盾:CDN和OBS能共用流量包吗?
  • 第8章 利用CSS制作导航菜单
  • C# 集合与泛型
  • el-date-picker 设置开始时间和结束时间
  • 【Docker】 常用命令
  • docker compose - 设置名字
  • 工业拍卖平台、信息发布、租赁商城平台系统适用于全行业解决方案。
  • 一个win32 / WTL下多线程库(CThread类)的使用心得
  • 使用wordpress搭建简易的信息查询系统
  • PAT甲级 1076 Forwards on Weibo(30)
  • 揭开 gRPC、RPC 、TCP和UDP 的通信奥秘
  • 使用Web Worker来处理多线程操作,以及如何避免主线程卡顿。
  • 杂谈:业务说的场景金融是什么?
  • 在vscode实现用和Chrome开发者工具中相同的快捷键进行面板切换
  • 【ESP32+MicroPython】硬件控制基础
  • Python学习从0到1 day26 第三阶段 Spark ① 数据输入
  • kafka消费者的消费分区策略有哪些,默认是哪个?
  • 前端常用时间操作汇总
  • 106. UE5 GAS RPG 使用MVVM
  • Elasticsearch中什么是倒排索引?
  • 深度学习:AT Decoder 详解