/// <summary> /// codePoint是否是表情字符 /// 参考java的codePointAt /// </summary> public static bool isEmojiCharacter(int codePoint) { object obj = CustomerUtil.EmojiEventInvoke("isEmojiCharacter", codePoint); if (obj != null) { bool result = obj is bool && (bool)obj; if (result) { return(true); //lua判断是表情字符,那么就是表情字符。否则继续下面的判断 } } return((codePoint >= 0x2600 && codePoint <= 0x27BF) || // 杂项符号与符号字体 codePoint == 0x303D || codePoint == 0x2049 || codePoint == 0x203C || (codePoint >= 0x2000 && codePoint <= 0x200F) || // (codePoint >= 0x2028 && codePoint <= 0x202F) || // codePoint == 0x205F || // (codePoint >= 0x2065 && codePoint <= 0x206F) // /* 标点符号占用区域 */ || (codePoint >= 0x2100 && codePoint <= 0x214F) ||// 字母符号 (codePoint >= 0x2300 && codePoint <= 0x23FF) || // 各种技术符号 (codePoint >= 0x2B00 && codePoint <= 0x2BFF) || // 箭头A (codePoint >= 0x2900 && codePoint <= 0x297F) || // 箭头B (codePoint >= 0x3200 && codePoint <= 0x32FF) || // 中文符号 (codePoint >= 0xD800 && codePoint <= 0xDFFF) || // 高低位替代符保留区域 (codePoint >= 0xE000 && codePoint <= 0xF8FF) || // 私有保留区域 (codePoint >= 0xFE00 && codePoint <= 0xFE0F) || // 变异选择器 codePoint >= 0x10000); // Plane在第二平面以上的,char都不可以存,全部都转 }
static int QPYX_EmojiEventInvoke_YXQP(IntPtr L_YXQP) { try { ToLua.CheckArgsCount(L_YXQP, 2); string QPYX_arg0_YXQP = ToLua.CheckString(L_YXQP, 1); object QPYX_arg1_YXQP = ToLua.ToVarObject(L_YXQP, 2); object QPYX_o_YXQP = CustomerUtil.EmojiEventInvoke(QPYX_arg0_YXQP, QPYX_arg1_YXQP); ToLua.Push(L_YXQP, QPYX_o_YXQP); return(1); } catch (Exception e_YXQP) { return(LuaDLL.toluaL_exception(L_YXQP, e_YXQP)); } }
/// <summary> /// /// </summary> private static bool isGetEmoji(int codePoint, int nextCodePoint, int curEmojiCount) { object obj = CustomerUtil.EmojiEventInvoke("isGetEmoji", codePoint); if (obj != null) { bool result = obj is bool && (bool)obj; if (result) { return(true); //lua判断是,那么就是。否则继续下面的判断 } } if (curEmojiCount == 1) { if (isEndCodePoint(nextCodePoint)) { return(false);//下一个表情是结尾的 } if (nextCodePoint == 0x200d || nextCodePoint == 0x2764) { return(false);//下一个表情符必须要 } if (isFlag(codePoint)) { return(false);//国旗符一定是两个组成 } return(true); } if (curEmojiCount == 2) { if (isFlag(codePoint)) { return(true); } if (isEndCodePoint(codePoint)) { return(true); } if (codePoint == 0x200d || codePoint == 0x2764) { return(false); } } //这里就一直往下加 return(false); }
/// <summary> /// 是否是国旗表情,国旗占两位 /// </summary> /// <returns></returns> private static bool isFlag(int codePoint) { object obj = CustomerUtil.EmojiEventInvoke("isFlag", codePoint); if (obj != null) { bool result = obj is bool && (bool)obj; if (result) { return(true); //lua判断是,那么就是。否则继续下面的判断 } } if (codePoint >= 0x1f1e0 && codePoint <= 0x1f1ff) { return(true); } return(false); }
/// <summary> /// 将表情字符串转成unicode(result eg1:1f60a(微笑) eg2:1f1e8_1f1f3(国旗表情)) /// 结果与表情图片相对应 /// </summary> public static string toUnicode(string s) { object obj = CustomerUtil.EmojiEventInvoke("toUnicode", s); if (obj != null && obj is string) { string result = (string)obj; if (!string.IsNullOrEmpty(result)) { return(result); //lua层能返回结果,那么以lua为准 } } else { Debug.LogWarning("toUnicode call failure"); } var bytes = Encoding.UTF32.GetBytes(s); var stringBuilder = new StringBuilder(); List <List <byte> > resultList = new List <List <byte> >(); List <byte> tempList = new List <byte>(); for (int i = 0, length = bytes.Length; i < length; i++) { tempList.Add(bytes[i]); if (tempList.Count == 4) { tempList.Reverse(); resultList.Add(tempList); tempList = new List <byte>(); } } for (int i = 0, length = resultList.Count; i < length; i++) { List <byte> elist = resultList[i]; bool isFirst = false; for (int j = 0; j < elist.Count; j++) { string b = elist[j].ToString("x2"); if (b == "00" && j < 2) { continue; } if (!isFirst) { isFirst = true; if (j < 2) { b = elist[j].ToString("x"); } stringBuilder.Append(b); } else { stringBuilder.Append(b); } //Debug.Log(b); } if (isFirst && i != length - 1) { stringBuilder.Append("_"); } } return(stringBuilder.ToString().Replace("_0000", "")); }