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

来源:http://www.cnblogs.com/lilo202/archive/2017/12/18/8058012.html
-Advertisement-
Play Games

最近做的項目,上線後一切正常,過段時間管理員反饋用戶導出EXCEL報錯,前臺獲取用戶列表不顯示,查找問題找到是微信昵稱、emoji表情導致報錯, emoji表情介紹 由於微信介面中對於emoji表情使用的是UTF-8的二進位字元串,並沒有解碼,表現就是當收到微信端用戶發來的emoji表情時,顯示為一 ...


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

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文地址:http://www.cnblogs.com/a7345678/archive/2008/09/25/1298838.html 轉自博客園暗夜精靈-鬼才閣 實現業務系統中的用戶許可權管理 B/S系統中的許可權比C/S中的更顯的重要,C/S系統因為具有特殊的客戶端,所以訪問用戶的許可權檢測可以通過 ...
  • 1,有變數name = "aleX leNb" 完成如下操作: 1) 移除 name 變數對應的值兩邊的空格,並輸出處理結果 s = name.strip() Print(s) 2) 移除name變數左邊的’al’並輸出處理結果 s = name.lstrip(‘al’) Print(s) 3) 移 ...
  • load是一個方法,在程式文件中,只有ruby遇到它的時候才會執行。Ruby不會搜索整個文件去執行load命令。也就是說,當Ruby解釋器遇到它的時候,它才會去尋找它要載入的文件。這意味著需要載入的文件名可以在運行時動態地決定。甚至可以在條件語句中包含一個load指令的調用,讓它只有在條件尾true ...
  • 分別使用過List中Distinct(),GroupBy()實現鏈表的去重。 1.先上效果: 一維鏈表中分別有元素“aa”,"bb",'aa','aa',"cc",使用Distinct()方法後輸出 aa,bb,cc 二維鏈表中類型為ClassA類型,其中對象的屬性A分別為1,1,2,3,1,使用G ...
  • .NET Core 兩種GC模式: Server GC / Workstation GC Server GC : 主要應用於多處理器系統,並且作為ASP.NET Core宿主的預設配置。它會為每個處理器都創建一個GC Heap,並且會並行執行回收操作。該模式的GC可以最大化吞吐量和較好的收縮性。這種... ...
  • 一.什麼是值類型?什麼引用類型? 1.值類型的值是存儲在棧上的。引用類型是存在堆上的。 2.值類型變數聲明之後,不管是否已經分配記憶體,編譯器在堆上為其分配記憶體。 3.引用類型聲明的時候,這時候只在棧中分配一小片記憶體用於容納一個地址,此時候並沒有為其分配堆上的記憶體地址,當new一個實例的時候,真正創建 ...
  • PS:寫這個主要是基礎差,寫這麼一個主要是為了自己查漏補缺,不會的搞會了。會了搞的更會。順便整理知識。 目錄 1.C#知識點之:值類型和引用類型 ...
  • 先來看看下麵一個類中的一些方法: class Bc { public double Add(double number1, double number2) { return number1 + number2; } public double Multiply(double number1, dou ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...