如何使服务器兼容Emoji表情符号的几种办法

我们都知道 用户使用移动设备发表评论或昵称时会输入一些emoji表情,服务器对emoji表情直接保存不兼容, 如果客户端直接把表情符号传给服务端保存的话, 会得到一个保存失败的错误, 一般原因是数据库使用的是mysql utf8字符集存储的。utf8最大支持3个字节的unicode,而emoji表情和一些特殊符号需要4个字节才能存储。因此导致用户输入的emoji表情时存储失败。 那如何解决这个问题呢,下面列出几种解决的办法:

办法一:

  • 修改数据库字符集编码,通过把原来的utf8编码修改为utf8mb4可以完美解决问题,操作步骤如下:
    1. 修改mysql服务器配置文件中的 character_set_database=utf8mb4 和 character_set_server=utf8mb4,可以是mysql支持utf8mb4编码。

    2. 在应用中连接mysql服务器时指定字符集为utf8mb4可以 保证读取和写入的数据是utf8mb4的编码,从而达到客户端和服务器端一直。在连接时指定字符集将影响到 character_set_client 和character_set_connection 两个参数为utf8mb4。

    3. 修改现有的数据库表字符集,如下


      修改前
修改为
修改后
  1. 然后修改表中字段的字符集为utf8mb4,不推荐在一张表中使用多种字符集。

utf8mb4的优势

1、utf8mb4是今后的趋势
2、utf8mb4是utf8的超集,兼容utf8并且可以支持emoji表情存储

utf8mb4的缺点

由于utf8mb4采用4个字节存储数据,而utf8最多使用3个字节存储数据,所以使用utf8mb4需要占用更大的存储空间

风险点

1、在一张表里面混用utf8字符集和utf8mb4字符集在进行 连接 查询时会发生类型的隐式转换,导致索引失效

规避风险

1、在同一个表中使用相同的字符集编码,禁止混用不同字符集
2、先在测试环境实施改造,观察运行情况
3、做好数据的备份工作

效果演示

修改数据库字符集编码效果演示

办法二:

  • 在客户端输入表情的时候直接过滤掉那些表情,只要不过滤掉不传给服务器, 就不会存在保存失败的情况; 当然这个办法没有从根本上解决保存的问题, 如果你的需求需要保存表情, 自然这个方法不满足要求;

注意:保持严格遵守不触碰用户数据的原则,如果能尽量考虑用户体验的前提下,该方案慎重考虑

  • 这里是边输入边用正则表达式去过滤表情, 可以在输入文字的代理方法里面加做过滤的逻辑;
#pragma mark - <UITextViewDelegate>

- (void)textViewDidChange:(UITextView *)textView
{
    NSLog(@"没有过滤前输入的字符串===%@",textView.text);
    NSString *filterString = [self disableEmoji:textView.text];
    NSLog(@"过滤Emoji表情后的字符串===%@",filterString);
    textView.text = filterString;
}

/**
 *  正则过滤表情
 */
- (NSString *)disableEmoji:(NSString *)text
{
    if (!text.length) return text;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]" options:NSRegularExpressionCaseInsensitive error:nil];
    NSString *modifiedString = [regex stringByReplacingMatchesInString:text
                                                               options:0
                                                                 range:NSMakeRange(0, [text length])
                                                          withTemplate:@""];
    return modifiedString;
}

办法三:

  • 第三种办法使用base64编码解决,此可以联想到我们在请求有中文链接的网址时会请求失败, 正常的处理是先把含有中文的网址进行编码后在请求就会成功, 因此,我们保存表情时也可以你用这种办法;

使用:这里在你把转码后的操作发给服务器后, 需要做的一个额外操作就是, 你再从服务器取回来显示时, 需要反转一下之前的编码才能正常显示出表情符号, 否则就是一堆乱码, 如: 123456%F0%9F%98%83%E2%98%BA%F0%9F%98%9A%F0%9F%98%99%F0%9F%99%8412 ;

  1. 把含有表情的字符串进行编码后再发送给服务端:
NSString *inputText = [self.editTextView.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  • 注意: 这里如果你输入的字符串中已经含有一些已转义的特殊符号: % @ $等时, 上面的方法就不会再对这些特殊的进行转码, 可以使用下面的方法
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, (CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]", NULL, kCFStringEncodingUTF8);
  1. 对从服务器获取回来含有表情的字符串进行反转后显示在页面上:
NSString *showText = [serverString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  1. 把编码的字符串反转之后的显示效果图:
反转后显示的效果.png

注意点:
1、如果是针对一些用户输入的评论内容,可能需要进行人工审核,需要看到原始的数据,编码后会无法清晰的查看问题;
2、管理后台需要对评论内容,用户昵称等内容进行模糊匹配,编码后无法实现搜索;
3、评论内容从接收到最终在站点显示需要经过多个流程,频繁编码及解码会损失一些性能;

办法四:

  • 第三种办法就是把输入的表情转成NSData的二进制数据传给服务器;
NSData *data =[inputText dataUsingEncoding:NSUTF8StringEncoding];

不过这种办法客户端和服务端两边处理都比较麻烦, 不建议使用这种方法;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,619评论 2 7
  • 目录 简介简介技术栈编辑器 入门安装新建编译运行真机 进阶调试持久化插件管理 再进阶Hot-CodePush-No...
    诺之林阅读 2,656评论 1 11
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,107评论 29 470
  • 就是人们觉的每个都像说他自己? 你说的没错,是巴纳姆效应(Barnum effect)。 【实验】它又叫福勒效应,...
    幺幺小秋阅读 3,926评论 0 0
  • 正在准备大四毕业,工作很迷茫…不知该回家乡还是在城市!心里很迷茫,没有找到什么适合的工作,在迷茫是将就还是继续坚持...
    沉默书阅读 160评论 0 0