1. 程式人生 > >微信昵稱emoji表情,特殊表情導致列表不顯示,導出EXCEL報錯等問題解決!

微信昵稱emoji表情,特殊表情導致列表不顯示,導出EXCEL報錯等問題解決!

選擇器 過濾 col source 找到 emoji pos 不顯示 ~~

最近做的項目,上線後一切正常,過段時間管理員反饋用戶導出EXCEL報錯,前臺獲取用戶列表不顯示,查找問題找到是微信昵稱、emoji表情導致報錯,

技術分享圖片

emoji表情介紹

由於微信接口中對於emoji表情使用的是UTF-8的二進制字符串,並沒有解碼,表現就是當收到微信端用戶發來的emoji表情時,顯示為一個方塊型「」或是無法顯示的字符,這時就需要對其進行轉碼。

每個emoji表情其實都有相應的unicode編碼,在解析用戶向公眾號發送的文字中的emoji表情字符時,我們可以根據unicode碼來匹配或存儲信息中的emoji表情;同理在向用戶發送包含emoji表情的文字消息時,則將表情字符根據unicode編碼進行二進制轉碼後再發送。

找網上各種,全是PHP和JAVA拿來試驗一下,沒解決問題,坑~~~,繼續尋找,然後改造和請教群友,解決此問題

我使用的簡單粗暴的方法,直接過濾到了emoji編碼,暫時沒有發現誤傷:

  1  #region 去掉表情符號
  2         /// <summary>
  3         /// 去掉表情符號
  4         /// </summary>
  5         /// <param name="codePoint"></param>
  6         /// <returns></returns>
7 public static bool isEmojiCharacter(char codePoint) 8 { 9 return (codePoint >= 0x2600 && codePoint <= 0x27BF) // 雜項符號與符號字體 10 || codePoint == 0x303D 11 || codePoint == 0x2049 12 || codePoint == 0x203C
13 || (codePoint >= 0x2000 && codePoint <= 0x200F) // 14 || (codePoint >= 0x2028 && codePoint <= 0x202F) // 15 || codePoint == 0x205F // 16 || (codePoint >= 0x2065 && codePoint <= 0x206F) // 17 /* 標點符號占用區域 */ 18 || (codePoint >= 0x2100 && codePoint <= 0x214F) // 字母符號 19 || (codePoint >= 0x2300 && codePoint <= 0x23FF) // 各種技術符號 20 || (codePoint >= 0x2B00 && codePoint <= 0x2BFF) // 箭頭A 21 || (codePoint >= 0x2900 && codePoint <= 0x297F) // 箭頭B 22 || (codePoint >= 0x3200 && codePoint <= 0x32FF) // 中文符號 23 || (codePoint >= 0xD800 && codePoint <= 0xDFFF) // 高低位替代符保留區域 24 || (codePoint >= 0xE000 && codePoint <= 0xF8FF) // 私有保留區域 25 || (codePoint >= 0xFE00 && codePoint <= 0xFE0F) // 變異選擇器 26 // || (codePoint >= U + 2600 && codePoint <= 0xFE0F) 27 || codePoint >= 0x10000; // Plane在第二平面以上的,char都不可以存,全部都轉 28 29 } 30 /// <summary> 31 /// 檢測是否有emoji字符 32 /// </summary> 33 /// <param name="source"></param> 34 /// <returns></returns> 35 public static bool containsEmoji(String source) 36 { 37 if (string.IsNullOrEmpty(source)) 38 { 39 return false; 40 } 41 42 int len = source.Length; 43 44 for (int i = 0; i < len; i++) 45 { 46 char codePoint = source[i]; 47 48 if (isEmojiCharacter(codePoint)) 49 { 50 //do nothing,判斷到了這裏表明,確認有表情字符 51 return true; 52 } 53 } 54 55 return false; 56 } 57 /// <summary> 58 /// 過濾emoji 或者 其他非文字類型的字符 59 /// </summary> 60 /// <param name="source">param source</param> 61 /// <returns></returns> 62 public static String filterEmoji(String source) 63 { 64 if(string.IsNullOrWhiteSpace(source)) 65 { 66 return ""; 67 } 68 source = source.Replace("[^\\u0000-\\uFFFF]", "").Replace("??", ""); 69 if (!containsEmoji(source)) 70 { 71 return source; //如果不包含,直接返回 72 } 73 //到這裏鐵定包含 74 StringBuilder buf = null; 75 76 int len = source.Length; 77 78 for (int i = 0; i < len; i++) 79 { 80 char codePoint = source[i]; 81 82 if (!isEmojiCharacter(codePoint)) 83 { 84 if (buf == null) 85 { 86 buf = new StringBuilder(source.Length); 87 } 88 89 buf.Append(codePoint); 90 } 91 else 92 { 93 } 94 } 95 96 if (buf == null) 97 { 98 return source; //如果沒有找到 emoji表情,則返回源字符串 99 } 100 else 101 { 102 if (buf.Length == len) 103 { 104 //這裏的意義在於盡可能少的toString,因為會重新生成字符串 105 buf = null; 106 return source; 107 } 108 else 109 { 110 return buf.ToString(); 111 } 112 } 113 114 } 115 #endregion

前臺

技術分享圖片

成功……

技術分享圖片

到此解決了微信昵稱emoji表情,特殊表情導致列表不顯示,導出EXCEL報錯等問題解決!

代碼雖然不是最完美的,也有優化的空間,非常感謝群友“燃冰”。

微信昵稱emoji表情,特殊表情導致列表不顯示,導出EXCEL報錯等問題解決!