zoukankan      html  css  js  c++  java
  • 微信昵称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报错等问题解决!

    代码虽然不是最完美的,也有优化的空间,非常感谢群友“燃冰”。

  • 相关阅读:
    [笔记].新唐M051型号的后缀解读
    [转载].怎样理解阻抗匹配
    [原创][连载].基于SOPC的简易数码相框 Nios II SBTE部分(软件部分) TFTLCD(控制器为ILI9325)驱动
    [转载].关于STM32的CPU为32位,定时器却为16位的探讨
    [笔记][朝花夕拾][Multisim基础电路范例].第一章 RLC电路,第九节 基尔霍夫电流定律
    [原创].如何解决Nios II SBTE中出现的undefined reference to `xxx'警告
    [原创][连载].基于SOPC的简易数码相框 Nios II SBTE部分(软件部分) ADS7843触摸屏驱动测试
    [笔记][朝花夕拾][Multisim基础电路范例].第一章 RLC电路,第十一节 叠加定理
    [笔记].怎样在IAR中加入编译所需库的头文件?
    [原创][连载].基于SOPC的简易数码相框 Nios II SBTE部分(软件部分) 从SD卡内读取图片文件,然后显示在TFTLCD上
  • 原文地址:https://www.cnblogs.com/lilo202/p/8058012.html
Copyright © 2011-2022 走看看