Unity之TMP_InputField-输入字符数限制


前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值