小序

对于 EditText 下输入表情的处理已是老生长谈,此前仅需禁止输入即可。
固不懂得这表情在前后端上,究竟需采取何种方式上传获取???带着这种疑惑 …

QA 调查

1. 为何表情符号无法正常上传

数据库无正确指定存储字段的编码方式(utf8mb4,该编码方式需数据库为 5.5.3 即以上版本);

2. 数据库版本不支持或修改影响大怎么办

还能怎么办,只能由前端自行解决问题了。而解决问题关键就是将特定的表情符号转为与数据故对应的编码方式。具体方案有以下两种:

  • 拟定【表情Img-表情符号】对照表
  • 上传内容加密/转义处理

3. 表情Img-表情符号

该处理方案一般作用于聊天窗口下的自定义输入法,自带表情包那种。当然个人并没具体实践过,所以不多做辩解。其具体形式如下(仅参考):

public static final int[] EmojiResArray = {R.drawable.d_aini,R.drawable.d_aoteman,R.drawable.d_baibai,R.drawable.d_chanzui,R.drawable.d_chijing,R.drawable.d_dahaqi,R.drawable.d_feizao,R.drawable.d_ganmao,R.drawable.d_guzhang,...
};public static final String[] EmojiTextArray = {"[爱你]","[奥特曼]","[拜拜]","[悲伤]","[鄙视]","[闭嘴]","[馋嘴]","[吃惊]","[哈欠]","[打脸]","[顶]","[doge]","[肥皂]","[感冒]","[鼓掌]",...
};

4. 加密/转义

操作 描述
URLEncoder.encode(content,”UTF-8”) 可自动识别表情符号,对其进行编码/解码。但若数据库仍未实现 utf8mb4 编码依旧插入数据失败
Base64.decode(content, Base64.DEFAULT) 可实现但加密导致记录值过长,且无参照物作用于仅表情符号的加解密处理,容易导致其余正常文本信息出现解密时显示错乱
Unicode 针对字符转义为对应 unicode 编码,通用性强。对比 Base64 加密处理,虽记录值也随之变长,但可通过参照物 “\u” 以及表情特定符号,仅对其进行转义处理

实现

基于以上折腾,最后前端与APP端统一采取 Unicode 表情符转义处理。直接上代码:

1. Android

/*** 把 Unicode 中的表情符号转成表情图片** @param unicodeStr* @return*/
public static String unicode2Str(String unicodeStr) {String[] asciis = unicodeStr.split("\\\\u");String nativeValue = asciis[0];try {for (int i = 1; i < asciis.length; i++) {String code = asciis[i];nativeValue += (char) Integer.parseInt(code.substring(0, 4), 16);if (code.length() > 4) {nativeValue += code.substring(4, code.length());}}} catch (NumberFormatException e) {return unicodeStr;}return nativeValue;
}/*** 把中文中的表情转成 Unicode 码** @param str* @return*/
public static String str2Unicode(String str) {String result = "";if (!TextUtils.isEmpty(str)) {for (int i = 0; i < str.length(); i++) {char chr1 = str.charAt(i);if (isEmojiCharacter(chr1)) {result += "\\u".concat(Integer.toHexString(chr1));} else {result += str.charAt(i);}}}return result;
}/*** 是否包含表情** @param codePoint* @return 如果不包含 返回false,包含 则返回true*/
private static boolean isEmojiCharacter(char codePoint) {return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)|| (codePoint == 0xD)|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));
}

2. IOS

+ (NSString *)emojiEncoding:(NSString *)string
{NSString *tempStr1 = [string stringByReplacingOccurrencesOfString:@"\\u"withString:@"\\U"];NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@"\""withString:@"\\\""];NSString *tempStr3 = [[@"\""stringByAppendingString:tempStr2] stringByAppendingString:@"\""];NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];NSString* returnStr = [NSPropertyListSerialization propertyListFromData:tempDatamutabilityOption:NSPropertyListImmutableformat:NULLerrorDescription:NULL];return [returnStr stringByReplacingOccurrencesOfString:@"\\r\\n"withString:@"\n"];
}+ (NSString *)emojiDecoding:(NSString *)string
{if (IsStrEmpty(string)){return string;}//正则表达式NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[\\ud83c\\udd23-\\ud83e\\udfff]|[\\ud83d\\udd23-\\ud83e\\udfff]|[\\u2600-\\u27ff]" options:0 error:nil];//筛选出匹配的字段NSMutableArray *matches = [[NSMutableArray alloc] initWithArray:[regex matchesInString:string options:0 range:NSMakeRange(0, string.length)]];NSMutableString *resultStr = string.mutableCopy;for (int i = (int)matches.count; i > 0; i--){NSTextCheckingResult *result = matches[i-1];NSRange matchRange = [result range];NSString *emoji = [resultStr substringWithRange:matchRange];NSString *uniStr = [NSString stringWithUTF8String:[emoji UTF8String]];NSData *uniData = [uniStr dataUsingEncoding:NSNonLossyASCIIStringEncoding];[resultStr replaceCharactersInRange:matchRange withString:[[NSString alloc] initWithData:uniData encoding:NSUTF8StringEncoding]];}return resultStr;
}

3.Web

$("#id").text(unescape($(obj).attr("rel").replace(/\\u/g, '%u')));

结语

Android 我也是参考前辈们改改的,当然 IOS,WEB 只是照贴的(偷笑)。需要注意的是,对于APP端使用到的正则函数,某些表情或因官方新的 Emoji 表情包更新,而没有办法识别需自行修改正则表达式。如果有更好解决方案的话,请在评论技能冷却完后于评论区放招。

Emoji 表情转义止于前端相关推荐

  1. 微信消息收发与微信内部emoji表情转义

    微信消息收发与微信内部emoji表情转义 目录 微信内部emoji表情转义与消息收发 一.概述 二.常用标准emoji表情字符.微信内部转义符.unicode对照表 1.比如 2.微信聊天窗口emoj ...

  2. mysql数据库保存微信emoji表情转义

    /** 过滤表情* */public function parseEmojiTounicode($stremoji){$text = preg_replace_callback('/[\xf0-\xf ...

  3. php保存emoji表情,php保存emoji表情

    最近一个朋友在调用微信接口的时候,获取到的数据保存到数据库失败了,原因是因为里面含有emoji表情,接下来吾爱编程为大家介绍一下关于php保存emoji表情的方法,有需要的小伙伴可以参考一下: 1.保 ...

  4. php 表情怎么存储位置,php保存emoji表情

    最近一个朋友在调用微信接口的时候,获取到的数据保存到数据库失败了,原因是因为里面含有emoji表情,接下来吾爱编程为大家介绍一下关于php保存emoji表情的方法,有需要的小伙伴可以参考一下: 1.保 ...

  5. emoji无法显示_解决应用中无法存储及显示Emoji表情的问题

    一.问题描述,公司开发的应用中,有些内容是用户可以自己输入的,比如文章的评论,客户模块的客户姓名,客户备注等等,这些内容用户都是可以自己随意输入的,在使用的过程中发现,当客户输入emoji表情的时候, ...

  6. php mysql表情符号_php + mysql 存入表情 【如何转义emoji表情,让它可以存入utf8的数据库】...

    方法1:base_encode64 这种方法是可以,但是旧数据没有经过encode操作,取数据的时候如果统一进行decode的话,旧数据会丢失的. 1 方法2:urlencode 这个似乎可以,对没有 ...

  7. 移动前端手机输入法自带emoji表情字符处理

    原文链接 : https://blog.csdn.net/binjly/article/details/47321043 今天,测试给我提了一个BUG,说移动端输入emoji表情无法提交.很早以前就有 ...

  8. java过滤ios表情,JS前端去掉emoji表情和Java后台处理emoji表情方法

    莫非定律 : 任何事情都没表面看去来那么简单! emoji表情在项目中使用,因为其特殊的编码格式,经常导致在网络传输.编解码.以及数据入库中带来一些问题! 下面简单介绍使用Js和java处理移除emo ...

  9. mysql ud83cudf19__如何转义emoji表情,让它可以存入utf8的数据库?

    unicode emoji是4个字节的,存不进MySQL里,找到一个转义的库http://code.iamcal.com/php/emoji/,但是转为Unicode之后,还是4个字节,一样存不进,应 ...

最新文章

  1. 中科大团队打造“象鼻”机器人,开门、擦玻璃、会给女朋友拧瓶盖的那种
  2. HTML areamap标签及在实际开发中的应用
  3. hihoCoder #1449 : 后缀自动机三·重复旋律6
  4. 简易中控紫猫插件版(3)压缩包使用说明
  5. 【POJ - 1995】Raising Modulo Numbers(裸的快速幂)
  6. 基于ASP.net耳机网店商城系统(前台页面+后台页面)
  7. wdcp安装中的小知识
  8. python fetchall函数_关于python中的查询数据库内容中用到的fetchone()函数和fetchall()函数(转)还有fetchmany()...
  9. linux安装命令安装包下载地址,linux 用命令行下载的安装包放在哪里
  10. Hello Ragel -- 生成状态机的神器
  11. 新版抖音二维码生成工具源码+实测可用
  12. 如何用计算机完成一篇文稿制作步骤,第5章 计算机一级演示文稿制作经典教程.ppt...
  13. ArrayList扩容机制源码分析
  14. Python处理Excel(6):处理清产核资表格(1)
  15. python地产成本_Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(二)...
  16. python经验总结_Python语言经验总结
  17. 微信公众号的web开发者工具的自助解绑功能终于有了!
  18. 新松机器人socket_谈谈本人对新松的印象,给后辈们一点启示
  19. TypeError: only size-1 arrays can be converted to Python scalars
  20. 蓝牙的ATT协议(属性协议)和GATT协议

热门文章

  1. Bzoj 2054: 疯狂的馒头
  2. 卫星工具包在分布式仿真中的实时控制研究
  3. ETA1801/ETA1802/ETA1805,100V、1A,高效同步降压变频器,输入高耐压、频率可调整
  4. 解决Windows 2003识别不了的移动硬盘
  5. JavaScript实现列表功能
  6. 信息安全上演“无间道” 京东、腾讯如何破解
  7. redis设置用户名和密码linux,redis的密码设置(windows与linux相同)
  8. docker设置redis密码
  9. PostgreSQL的递归查询(RECURSIVE)
  10. Unity_设计模式_外观模式_06