本文共 1834 字,大约阅读时间需要 6 分钟。
我们在开发过程中遇到需要使用输入框的情况,输入框要做字符数限制,很便捷的InputField检视面板会有公开的字符数限制调节。但是你会发现,无论是英文字符还是中文字符,它都是一视同仁的,这就很难受了,因为从展示上,中英文的位宽是不一样的,我们需要英文字符数显示的多一些,中文字符数少一些。下面就来解决这个问题。
我们知道英文字符在UTF-8的模式下只占1个字符,中文占2-5个字符,还有其它各类字符,我们这里主要考虑中英文, 通常来讲,我们可以限制一下输入内容的总字符数,比如限制为12个,将输入的内容进行UTF-8的转换,“aaa哈哈哈” ,总字符数为12个,哈 占3个。不过这样还有点问题,12个字符,中文只能输入4个。
abcdabcdabcd 12个字符你好呀哈 12个字符你好呀哈你好
很明显这样展示出来也不合理,所以我们需要把中文:英文的字数按1:2进行限制。
using TMPro;using UnityEngine;using UnityEngine.UI;////// 中文字符数转变为2/// [RequireComponent(typeof(TMP_InputField))]public class CharNumTransf : MonoBehaviour{ private TMP_InputField inputField; [Header("最大字数")] //英文算1个,中文算2个 public int MaxLimit = 16; private void Awake() { InputField if (inputField == null) { inputField = GetComponent(); } } void Start() { inputField.onValidateInput = _OnValidateInput; } char _OnValidateInput(string text, int charIndex, char addedChar) { if (GetTransCharNum(text) + GetTransCharNum(addedChar.ToString()) > MaxLimit) { return '\0'; //返回空 } return addedChar; } /// /// 字符串统计 /// /// ///int GetTransCharNum(string text) { int totalNum = 0; char[] alrText = text.ToCharArray(); foreach (var item in alrText) { totalNum += SingleCharTrans(item); } return totalNum; } /// /// 单个字符判断 /// /// ///int SingleCharTrans(char singChar) { int leng = System.Text.Encoding.UTF8.GetBytes(singChar.ToString()).Length; if (leng >= 2) { leng = 2; } return leng; }}
链接:https://pan.baidu.com/s/1Rar1pSsgwK_aCh2SuHqVrQ
提取码:t8wq转载地址:http://sovpz.baihongyu.com/