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

news2024/11/25 13:22:13

常规限定文本长度 ( 通过 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.coloradmin.cn/o/2237883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SH3001姿态解算

姿态角&#xff0c;机体坐标系相对于参考坐标系的角度 旋转的非交换性 姿态角指的是载体坐标系与参考系之间的关系&#xff0c; 欧拉角是描述物体与某个轴(X,Y,Z)的关系&#xff0c;欧拉角属于姿态角的一种常见描述形式&#xff0c;另外两种描述形式就是四元数和和旋转矩阵 飞…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-19

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

【C/C++】memcpy函数的使用

零.导言 当我们学习了strcpy和strncpy函数后&#xff0c;也许会疑惑整形数组要如何拷贝&#xff0c;而今天我将讲解的memcpy函数便可以拷贝整形数组。 一.memcpy函数的使用 memcpy函数是一种C语言内存函数&#xff0c;可以按字节拷贝任意类型的数组&#xff0c;比如整形数组。 …

【数据分享】1901-2023年我国省市县镇四级的逐年降水数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月降水栅格数据和Shp和Excel格式的省市县四级逐月降水数据&#xff0c;原始的逐月降水栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月数据我们采用求年累计值的方法得到逐年降水栅格数据&#…

【Qt问题】解决 Cannot retrieve debugging output

【Qt问题】解决 Cannot retrieve debugging output Chapter1 【Qt问题】解决 Cannot retrieve debugging output方案1 关闭其他Qt工程实例&#xff08;等于没说&#xff09;方案2 在PRO文件中&#xff0c;加上CONFIG console Chapter1 【Qt问题】解决 Cannot retrieve debuggi…

软考中级 软件设计师 上午考试内容笔记(个人向)Part.3

软考上午考试内容 7. 网络安全 威胁名称描述恶意攻击&#xff08;ARP&#xff09;所截获的合法通信数据拷贝&#xff0c;出于非法的目的而被重新发送。拒绝服务&#xff08;DOS&#xff09;对信息或其它资源的合法访问被无条件地阻止。窃听用户可利用合法或非法的手段窃取系统中…

第四十章 Vue之使用ESLint修正代码规范

目录 一、引言 二、前端开发规范 三、ESLint规范工具 四、ESLint规范错误解决方式 4.1. 手动修正 4.2. 自动修正 JavaScript Standard Style 规范说明地址&#xff1a; https://standardjs.com/rules-zhcn.html 一、引言 在我们实际项目的开发过程中&#xff0c;统一标…

力扣题目解析--删除链表的倒数第n个节点

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&…

web实操5——http数据详解,request对象功能

http请求数据 现在我们浏览器f12的那些是浏览器给http格式数据整理之后便于我们阅读的。 原始的http格式信息&#xff1a; 就是按照一定格式和符号的字符串&#xff1a; 请求行&#xff1a;格式如下图 请求头&#xff1a;一个个key&#xff0c;value数据&#xff0c;用,分割…

大语言模型LLMs在医学领域的最新进展总结

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 相比其他学科&#xff0c;医学AI&#xff0c;是发表学术成果最多的领域。 医学数据的多样性和复杂性&#xff08;包括文本、图像、基因组数据等&#xff09;&#xff0c;使得…

React的概念以及发展前景如何?

React是一个由Facebook开发的用于构建用户界面的的开源JavaScript库&#xff0c;它主要用于构建大型、动态的Web应用程序。React的主要特点是使用VirtualDOM&#xff08;虚拟DOM&#xff09;来优化性能&#xff0c;并使用声明式的编程方式来编写UI。 React的主要概念包括&#…

计算机课程管理:Spring Boot与工程认证的协同

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【Linux系列】命令行中的文本处理:从中划线到下划线与大写转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

不一样的CSS(一)

目录 前言&#xff1a; 一、规则图形 1.介绍&#xff1a; 2.正方形与长方形&#xff08;实心与空心&#xff09; 2.1正方形&#xff1a; 2.2长方形 3.圆形与椭圆形&#xff08;空心与实心&#xff09; 3.1圆形与椭圆形 4.不同方向的三角形 4.1原理 4.2边框属性 5.四…

HPM6750EVK2开发板程序烧录测试

对于HPM6750EVK2开发板&#xff0c;官方板子上没有板载调试器&#xff0c;从淘宝上购买了一个&#xff0c;据说配套的调试器&#xff0c;进行测试&#xff0c;仅此进行记录。 开发板HPM6750EVK2 openocd调试器图片 openocd调试器&#xff0c;淘宝链接 http://e.tb.cn/h.TZH7b…

斐波那契数的第n个数代码分享(c基础)

1&#xff1a;迭代 //斐波那契数的第n个数 #include<stdio.h> //unsigned long long Fib(n) //{ // // if (1 n || 2 n) // return 1; // else return Fib((n - 1) Fib((n - 2); // // //} unsigned long long Fib(n) {if (n 1 || n 2)return 1;else{int j 3;u…

测试实项中的偶必现难测bug--一键登录失败

问题描述:安卓和ios有出现部分一键登录失败的场景,由于场景比较极端,衍生了很多不好评估的情况。 产生原因分析: 目前有解决过多次这种行为的问题,每次的产生原因都有所不同,这边根据我个人测试和收集复现的情况列举一些我碰到的: 1、由于我们调用的是友盟的一键登录的…

私域流量圈层在新消费时代的机遇与挑战:兼论开源 AI 智能名片、2 + 1 链动模式、S2B2C 商城小程序的应用

摘要&#xff1a;本文剖析了私域流量圈层在新消费时代呈现出的独特温度与信任优势&#xff0c;阐述了从传统销售到新消费转型中用户心理的变化。同时&#xff0c;强调了内容对于私域流量的关键作用&#xff0c;并分析开源 AI 智能名片、2 1 链动模式、S2B2C 商城小程序在私域流…

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…