miduo_client/Assets/LuaFramework/Scripts/Tools/CheckInputLength.cs

196 lines
4.8 KiB
C#
Raw Normal View History

2020-05-09 13:31:21 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CheckInputLength : MonoBehaviour
{
public enum SplitType
{
ASCII = 1,
GB = 2,
Unicode = 3,
UTF8 = 4,
}
public InputField input;
public int CHARACTER_LIMIT = 12;
public SplitType m_SplitType = SplitType.ASCII;
void Awake()
{
if (input != null)
{
input.onValueChanged.AddListener(CheckValue);
}
}
public void CheckValue(string text)
{
Check();
}
public void Check()
{
input.text = GetSplitName((int)m_SplitType);
}
public string GetSplitName(int checkType)
{
string temp = input.text.Substring(0, (input.text.Length < CHARACTER_LIMIT + 1) ? input.text.Length : CHARACTER_LIMIT + 1);
if (checkType == (int)SplitType.ASCII)
{
return SplitNameByASCII(temp);
}
else if (checkType == (int)SplitType.GB)
{
return SplitNameByGB(temp);
}
else if (checkType == (int)SplitType.Unicode)
{
return SplitNameByUnicode(temp);
}
else if (checkType == (int)SplitType.UTF8)
{
return SplitNameByUTF8(temp);
}
return "";
}
//4、UTF8编码格式汉字3byte英文1byte,//UTF8编码格式,目前是最常用的
private string SplitNameByUTF8(string temp)
{
string outputStr = "";
int count = 0;
for (int i = 0; i < temp.Length; i++)
{
string tempStr = temp.Substring(i, 1);
byte[] encodedBytes = System.Text.ASCIIEncoding.UTF8.GetBytes(tempStr);//Unicode用两个字节对字符进行编码
string output = "[" + temp + "]";
for (int byteIndex = 0; byteIndex < encodedBytes.Length; byteIndex++)
{
output += Convert.ToString((int)encodedBytes[byteIndex], 2) + " ";//二进制
}
Debug.Log(output);
int byteCount = System.Text.ASCIIEncoding.UTF8.GetByteCount(tempStr);
Debug.Log("字节数=" + byteCount);
if (byteCount > 1)
{
count += 2;
}
else
{
count += 1;
}
if (count <= CHARACTER_LIMIT)
{
outputStr += tempStr;
}
else
{
break;
}
}
return outputStr;
}
private string SplitNameByUnicode(string temp)
{
string outputStr = "";
int count = 0;
for (int i = 0; i < temp.Length; i++)
{
string tempStr = temp.Substring(i, 1);
byte[] encodedBytes = System.Text.ASCIIEncoding.Unicode.GetBytes(tempStr);//Unicode用两个字节对字符进行编码
if (encodedBytes.Length == 2)
{
int byteValue = (int)encodedBytes[1];
if (byteValue == 0)//这里是单个字节
{
count += 1;
}
else
{
count += 2;
}
}
if (count <= CHARACTER_LIMIT)
{
outputStr += tempStr;
}
else
{
break;
}
}
return outputStr;
}
private string SplitNameByGB(string temp)
{
string outputStr = "";
int count = 0;
for (int i = 0; i < temp.Length; i++)
{
string tempStr = temp.Substring(i, 1);
byte[] encodedBytes = System.Text.ASCIIEncoding.Default.GetBytes(tempStr);
if (encodedBytes.Length == 1)
{
//单字节
count += 1;
}
else
{
//双字节
count += 2;
}
if (count <= CHARACTER_LIMIT)
{
outputStr += tempStr;
}
else
{
break;
}
}
return outputStr;
}
private string SplitNameByASCII(string temp)
{
byte[] encodedBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(temp);
string outputStr = "";
int count = 0;
for (int i = 0; i < temp.Length; i++)
{
if ((int)encodedBytes[i] == 63)//双字节
count += 2;
else
count += 1;
if (count <= CHARACTER_LIMIT)
outputStr += temp.Substring(i, 1);
else if (count > CHARACTER_LIMIT)
break;
}
if (count <= CHARACTER_LIMIT)
{
outputStr = temp;
}
return outputStr;
}
}