前言
我们在开发过程中遇到需要使用输入框的情况,输入框要做字符数限制,很便捷的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()
{
InputField
if (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