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


最近做的項目,上線后一切正常,過段時間管理員反饋用戶導出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報錯等問題解決!

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM