ios - android - web emoji互通方案及实现
ios
ios 表情较多,最新的还包含有肤色:
所以:https://github.com/vbonluk/iOS_Emoji 单就ios内实现的话,这篇文章支持的表情更全一些
但是,emoji跟多个平台互通:android,web,server保存。。所以,需要通过统一的手段实现。
转 html
https://www.jianshu.com/p/8436bdd30769
大致分为4类表情
单字节长的符号
ヘ,ડ等。。
这类表情出现在ios的表情”新鲜“一栏中,颜文字中这类的也较多。。这类里的表情是组合的,并且规则不统一,有些是单字节组合多字节,有些是多字节组合
单字符长 & 字节len > 2
༄
´´´´´´´´´´
••••••••••
普通表情
web,ios,android通用的表情,字符长 == 2;一般字节数 >= 4
这类表情,Unicode码是单一的
组合字符表情
如:
👩❤️💋👩 :U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F469
👯♀️:U+1F46F U+200D U+2640 U+FE0F
Unicode码是组合字符,lenght > 2..字符长都是大于2的。
表情过滤方案
方案1:收集几个特殊字符,获取十六进制码,过滤掉
处理:特殊字符Unicode需要自己收集,不合理,但是当成表情处理发送,android端可能没有,会显示为:
可以妥协
特殊字符:UniChar隐藏版iPhone特殊表情
如果需要收集,这里特殊表情大全,需要ios13手机copy处来,用ios代码计算出来各个表情的Unicode码
方案2:当成非表情发送。。。特殊的:作业接口不行
处理:༄。这类符号,其实是单字节的表情,特殊匹配处理:
1):获取表情Unicode码:格式为@"F04",非@"OxF04"
2):转为html。形如:@"༄"..为了跟普通表情保持统一,需要在前面补0::形如:@”༄“
3):格式化单字节表情hmtl码:补全长度为9.。
android server 互通
android 库:
android emoji转html,有16进制的,如:⚾ 有是进制的,如:⚾
所以:到ios端,需要特殊处理兼容一下。。。
是否是十六进制,处理一下
修饰符
️ 就是 ️
在处理的时候,原html字符串的截取要考虑到这种修饰符。以为它:不占位置,但有长度
Unicode码是:FE00 ~ FE0F
这中符号,在正则匹配中,就不要匹配出来,空就空了。不要匹配出来转hmtl。正常。。
建议先将emoji转html,再过滤
__block NSString *result = text;
NSString * regExpStr = @"[\\uFE00-\\uFE0F]";
NSString * replacement = @"";
NSRegularExpression *regExp = [[NSRegularExpression alloc] initWithPattern:regExpStr options:NSRegularExpressionCaseInsensitive error:nil];
// 替换匹配的字符串为
result = [regExp stringByReplacingMatchesInString:result
options:NSMatchingReportProgress
range:NSMakeRange(0, result.length)
withTemplate:replacement];
高半代理
bianti.png肤色
从Unicode字符表里能查到
unitl
回头补上我的链接
参考文章
方案偏
技术篇
技巧篇
物料偏
工具