您的位置:首页 > 移动开发 > 微信开发

微信昵称emoji表情,特殊表情导致列表不显示,导出EXCEL报错等问题解决!

2017-12-18 15:52 941 查看
最近做的项目,上线后一切正常,过段时间管理员反馈用户导出EXCEL报错,前台获取用户列表不显示,查找问题找到是微信昵称、emoji表情导致报错,



emoji表情介绍

由于微信接口中对于emoji表情使用的是UTF-8的二进制字符串,并没有解码,表现就是当收到微信端用户发来的emoji表情时,显示为一个方块型「」或是无法显示的字符,这时就需要对其进行转码。

每个emoji表情其实都有相应的unicode编码,在解析用户向公众号发送的文字中的emoji表情字符时,我们可以根据unicode码来匹配或存储信息中的emoji表情;同理在向用户发送包含emoji表情的文字消息时,则将表情字符根据unicode编码进行二进制转码后再发送。

找网上各种,全是PHP和JAVA拿来试验一下,没解决问题,坑~~~,继续寻找,然后改造和请教群友,解决此问题

我使用的简单粗暴的方法,直接过滤到了emoji编码,暂时没有发现误伤:

#region 去掉表情符号
/// <summary>
/// 去掉表情符号
/// </summary>
/// <param name="codePoint"></param>
/// <returns></returns>
public static bool isEmojiCharacter(char codePoint)
{
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 >= U + 2600 && codePoint <= 0xFE0F)
|| codePoint >= 0x10000; // Plane在第二平面以上的,char都不可以存,全部都转

}
/// <summary>
/// 检测是否有emoji字符
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static bool containsEmoji(String source)
{
if (string.IsNullOrEmpty(source))
{
return false;
}

int len = source.Length;

for (int i = 0; i < len; i++)
{
char codePoint = source[i];

if (isEmojiCharacter(codePoint))
{
//do nothing,判断到了这里表明,确认有表情字符
return true;
}
}

return false;
}
/// <summary>
/// 过滤emoji 或者 其他非文字类型的字符
/// </summary>
/// <param name="source">param source</param>
/// <returns></returns>
public static String filterEmoji(String source)
{
if(string.IsNullOrWhiteSpace(source))
{
return "";
}
source = source.Replace("[^\\u0000-\\uFFFF]", "").Replace("??", "");
if (!containsEmoji(source))
{
return source; //如果不包含,直接返回
}
//到这里铁定包含
StringBuilder buf = null;

int len = source.Length;

for (int i = 0; i < len; i++)
{
char codePoint = source[i];

if (!isEmojiCharacter(codePoint))
{
if (buf == null)
{
buf = new StringBuilder(source.Length);
}

buf.Append(codePoint);
}
else
{
}
}

if (buf == null)
{
return source; //如果没有找到 emoji表情,则返回源字符串
}
else
{
if (buf.Length == len)
{
//这里的意义在于尽可能少的toString,因为会重新生成字符串
buf = null;
return source;
}
else
{
return buf.ToString();
}
}

}
#endregion


前台



成功……



到此解决了微信昵称emoji表情,特殊表情导致列表不显示,导出EXCEL报错等问题解决!

代码虽然不是最完美的,也有优化的空间,非常感谢群友“燃冰”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐