文章目录
- 前言
- 思路
- 代码
- 工程项目
前言
我们在开发过程中遇到需要使用输入框的情况,输入框要做字符数限制,很便捷的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;
/// <summary>
/// 中文字符数转变为2
/// </summary>
[RequireComponent(typeof(TMP_InputField))]
public class CharNumTransf : MonoBehaviour
{private TMP_InputField inputField;[Header("最大字数")]//英文算1个,中文算2个public int MaxLimit = 16;private void Awake(){InputFieldif (inputField == null){inputField = GetComponent<TMP_InputField>();}}void Start(){inputField.onValidateInput = _OnValidateInput;}char _OnValidateInput(string text, int charIndex, char addedChar){if (GetTransCharNum(text) + GetTransCharNum(addedChar.ToString()) > MaxLimit){return '\0'; //返回空}return addedChar;}/// <summary>/// 字符串统计/// </summary>/// <param name="text"></param>/// <returns></returns>int GetTransCharNum(string text){int totalNum = 0;char[] alrText = text.ToCharArray();foreach (var item in alrText){totalNum += SingleCharTrans(item);}return totalNum;}/// <summary>/// 单个字符判断/// </summary>/// <param name="singChar"></param>/// <returns></returns>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