之前因为要在游戏项目中添加IM系统,当需要有字符限制的时候。(在客户端判断长度)
第一时间想要运用NGUI的Input中Character Limit组件,但是发现它判断的字符长度并没有全角半角之分。
后来运用System.Text.Encoding.BigEndianUnicode等方法来判断时发现Unity在不同平台所判断出的字符长度并不相同。
然后想到了运用一下这种方法来判断字符长度
/// <summary>
/// 判断字符长度
/// </summary>
/// <param name="mString"></param>
/// <returns></returns>
public int CalculatePlaces(string mString)
{
int _placesNum = 0; //统计字节位数
char[] _charArray = mString.ToCharArray();
for (int i = 0; i < _charArray.Length; i++)
{
char _eachChar = _charArray[i];
if (_eachChar >= 0x4e00 && _eachChar <= 0x9fa5) //判断中文字符
_placesNum += 2;
else if (_eachChar >= 0x0000 && _eachChar <= 0x00ff) //已2个字节判断
_placesNum += 1;
}
return _placesNum;
}
同理能判断字符长度之后就可以相应的截取固定长度的字符
/// <summary>
/// 截取字符
/// </summary>
/// <param name="_mString">字符</param>
/// <param name="_mLenght">长度</param>
/// <returns>定长度的字符</returns>
public string InterceptPlaces(string _mString,int _mLenght)
{
int _placesNum = 0;
char[] _charArray = _mString.ToCharArray();
string _charReturn = string.Empty;
for (int i = 0; i < _charArray.Length; i++)
{
if (_placesNum < _mLenght)
{
char _eachChar = _charArray[i];
if (_eachChar >= 0x4e00 && _eachChar <= 0x9fa5) //判断中文字符
_placesNum += 2;
else if (_eachChar >= 0x0000 && _eachChar <= 0x00ff) //已2个字节判断
_placesNum += 1;
_charReturn += _eachChar.ToString();
}
else if (_placesNum >= _mLenght)
{
break;
}
}
return _charReturn.ToString();
}