using UnityEngine;
using System.Collections;
using System.Text;
using System;
public partial class StringUtil
{
///
/// 计算字符串的长度(包含处理中文字符)
///
///
///
public static int CalcStringLetterNum(string input)
{
int counter = 0;
for (int i = 0, imax = input.Length; i < imax; ++i)
{
if (IsChineseLetter(input, i))
{
counter += 2;
}
else
{
counter += 1;
}
}
return counter;
}
///
/// 截断字符串(包含处理中文字符)
///
///
///
///
public static string TrancString(string input, int maxEnglishLength)
{
int counter = 0;
for (int i = 0, imax = input.Length; i < imax; ++i)
{
if (IsChineseLetter(input, i))
{
if (counter <= maxEnglishLength && maxEnglishLength < (counter + 2))
return input.Substring(0, i);
counter += 2;
}
else
{
if (counter <= maxEnglishLength && maxEnglishLength < (counter + 1))
return input.Substring(0, i);
counter += 1;
}
}
return input;
}
///
/// 是不是中文字符
///
///
///
///
public static bool IsChineseLetter(string input, int index)
{
int code = 0;
int chfrom = System.Convert.ToInt32("4e00", 16);
int chend = System.Convert.ToInt32("9fff", 16);
if (input != "")
{
code = System.Char.ConvertToUtf32(input, index);
if (code >= chfrom && code <= chend)
{
return true;
}
else
{
return false;
}
}
return false;
}
///
/// 缩减字符串
///
///
///
public static string ShrinkString(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0, imax = str.Length; i < imax; i++)
{
if (str[i] == '\0')
break;
sb.Append(str[i]);
}
return sb.ToString();
}
///
/// 自定义的字符串比较
///
///
///
///
public static bool IsStringEqual(string left, string right)
{
if (System.Object.ReferenceEquals(left, right))
{
return true;
}
if (left == null && right == null)
return true;
if (left == null)
return false;
if (right == null)
return false;
int leftLen = left.Length;
int rightLen = right.Length;
int count = Mathf.Min(leftLen, rightLen);
for (int index = 0; index < count; ++index)
{
char leftChar = left[index];
char rightChar = right[index];
if (leftChar != rightChar)
return false;
}
if (leftLen > count && left[count] == '\0')
return true;
if (rightLen > count && right[count] == '\0')
return true;
if (leftLen == rightLen)
return true;
return false;
}
///
/// Bytes数组转utf8字符串
///
///
///
///
///
///
public static string GetUtf8StringFromByteBuffer(ref byte[] buffer, int fromIndex, int count, int bufferSize)
{
if (buffer == null)
return string.Empty;
if (fromIndex < bufferSize)
{
int maxCount = bufferSize - fromIndex;
count = Mathf.Min(maxCount, count);
string str = ShrinkString(System.Text.Encoding.UTF8.GetString(buffer, fromIndex, count));
return str;
}
LogHelper.LogError("fromIndex over flow.");
return "";
}
///
/// Bytes数组转utf8字符串
///
///
///
public static string GetUtf8StringFromByteBuffer(ref byte[] buffer)
{
return GetUtf8StringFromByteBuffer(ref buffer, 0, buffer.Length, buffer.Length);
}
///
/// Utf8字符串转Byte数组
///
///
///
///
///
///
public static void CopyByteBufferFromUtf8String(string srcStr, int srcOffset, ref byte[] dstBuffer, int dstOffset, int dstBufferSize)
{
int copyCount;
CopyByteBufferFromUtf8String(srcStr, srcOffset, ref dstBuffer, dstOffset, dstBufferSize, out copyCount);
}
///
/// Utf8字符串转Byte数组
///
///
///
///
///
///
///
public static void CopyByteBufferFromUtf8String(string srcStr, int srcOffset, ref byte[] dstBuffer, int dstOffset, int dstBufferSize, out int copyCount)
{
byte[] srcBuffer = System.Text.Encoding.UTF8.GetBytes(srcStr);
int srcLen = srcBuffer.Length;
srcLen = Mathf.Max(srcLen - srcOffset, 0);
int dstMaxCopyCount = dstBufferSize - dstOffset;
dstMaxCopyCount = Mathf.Max(dstMaxCopyCount, 0);
dstMaxCopyCount = Mathf.Min(dstMaxCopyCount, srcLen);
System.Buffer.BlockCopy(srcBuffer, srcOffset, dstBuffer, dstOffset, dstMaxCopyCount);
copyCount = dstMaxCopyCount;
}
///
/// Byte数组复制
///
///
///
///
///
///
public static void CopyByteBuffer(ref byte[] srcBuffer, int srcOffset, ref byte[] dstBuffer, int dstOffset, int dstBufferSize)
{
int copyCount;
CopyByteBuffer(ref srcBuffer, srcOffset, ref dstBuffer, dstOffset, dstBufferSize, out copyCount);
}
///
/// Byte数组复制
///
///
///
///
///
///
///
public static void CopyByteBuffer(ref byte[] srcBuffer, int srcOffset, ref byte[] dstBuffer, int dstOffset, int dstBufferSize, out int copyCount)
{
int srcLen = srcBuffer.Length;
srcLen = Mathf.Max(srcLen - srcOffset, 0);
int dstMaxCopyCount = dstBufferSize - dstOffset;
dstMaxCopyCount = Mathf.Max(dstMaxCopyCount, 0);
dstMaxCopyCount = Mathf.Min(dstMaxCopyCount, srcLen);
System.Buffer.BlockCopy(srcBuffer, srcOffset, dstBuffer, dstOffset, dstMaxCopyCount);
copyCount = dstMaxCopyCount;
}
///
/// Byte数组转十六进制字符串
///
///
///
public static string BytesToHex(byte[] bytes)
{
char[] c = new char[bytes.Length * 2];
byte b;
for (int bx = 0, cx = 0; bx < bytes.Length; ++bx, ++cx)
{
b = ((byte)(bytes[bx] >> 4));
c[cx] = (char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);
b = ((byte)(bytes[bx] & 0x0F));
c[++cx] = (char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);
}
return new string(c);
}
///
/// 十六进制字符串转Byte数组
///
///
///
public static byte[] HexToBytes(string str)
{
if (str.Length == 0 || str.Length % 2 != 0)
return new byte[0];
byte[] buffer = new byte[str.Length / 2];
char c;
for (int bx = 0, sx = 0; bx < buffer.Length; ++bx, ++sx)
{
// Convert first half of byte
c = str[sx];
buffer[bx] = (byte)((c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0')) << 4);
// Convert second half of byte
c = str[++sx];
buffer[bx] |= (byte)(c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0'));
}
return buffer;
}
}