问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求php过滤ios的Emoji表情的方法,如果字符串中包含Emoji表情就删除。

发布网友 发布时间:2022-04-08 11:00

我来回答

1个回答

热心网友 时间:2022-04-08 12:30

网上已经有开源的了!http://code.iamcal.com/php/emoji/ 你参考下

iOS 5.0之前,苹果都是采用3个字节来承接 emoji 表情,Java 的普通 char 可以支持显示。但 iOS 5.0 之后, 苹果升级了系统自带的 emoji 表情输入法,用的 Unicode 6 标准来统一,是采用4个 bytes 来承接一个 emoji 表情。如果不做处理的话,这种表情直接存储到 mysql5.5 以下的数据库是会报错的。就像这两个表情一样:口口, 在 Windows 8 以下估计都不支持显示,可能会显示成框框,可能压根就是空白, 你可以在 Mac 中使用Safari 浏览器中,就可以看到。经过测试,在 Mac 就算用 Chrome 浏览器(Version 25.0.1364.172)也是不行的。
这种数据在 Mysql 5.5 之前,UTF-8 支持1-3个字节的编码,从 Mysql5.5 开始后,可以支持4个字节的 UTF 编码,但要特殊标记。修改 Mysql 相应存储字段为 utf8mb4 。修改语句如下:
1 ALTER TABLE table_name
2 MODIFY COLUMN content varchar(500) CHARACTER
3 SET utf8mb4 COLLATE utf8mb4_unicode_ci
4 DEFAULT NULL COMMENT 'content of message';
在某种业务情景下,我们可以选择过滤掉这种“非法”的字符。我采用的方式是,在字符上面做操作,下面是Java示例代码,核心的代码附上,应该是 无法直接下载就能够编译,你得小小的做一些微调,没有额外的依赖:
01 public class EmojiFilter {
02
03 /**
04 * 检测是否有emoji字符
05 * @param source
06 * @return 一旦含有就抛出
07 */
08 public static boolean containsEmoji(String source) {
09 if (StringUtils.isBlank(source)) {
10 return false;
11 }
12
13 int len = source.length();
14
15 for (int i = 0; i < len; i++) {
16 char codePoint = source.charAt(i);
17
18 if (isEmojiCharacter(codePoint)) {
19 //do nothing,判断到了这里表明,确认有表情字符
20 return true;
21 }
22 }
23
24 return false;
25 }
26
27 private static boolean isEmojiCharacter(char codePoint) {
28 return (codePoint == 0x0) ||
29 (codePoint == 0x9) ||
30 (codePoint == 0xA) ||
31 (codePoint == 0xD) ||
32 ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
33 ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
34 ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
35 }
36
37 /**
38 * 过滤emoji 或者 其他非文字类型的字符
39 * @param source
40 * @return
41 */
42 public static String filterEmoji(String source) {
43
44 if (!containsEmoji(source)) {
45 return source;//如果不包含,直接返回
46 }
47 //到这里铁定包含
48 StringBuilder buf = null;
49
50 int len = source.length();
51
52 for (int i = 0; i < len; i++) {
53 char codePoint = source.charAt(i);
54
55 if (isEmojiCharacter(codePoint)) {
56 if (buf == null) {
57 buf = new StringBuilder(source.length());
58 }
59
60 buf.append(codePoint);
61 } else {
62 }
63 }
64
65 if (buf == null) {
66 return source;//如果没有找到 emoji表情,则返回源字符串
67 } else {
68 if (buf.length() == len) {//这里的意义在于尽可能少的toString,因为会重新生成字符串
69 buf = null;
70 return source;
71 } else {
72 return buf.toString();
73 }
74 }
75
76 }
77 }
还有优化的空间,但是已经能够满足大多数情况的需求,附上单元测试(JUnit4):
01 public class EmojiFilterTest {
02
03
04 /**
05 * 测试emoji表情
06 */
07 @Test
08 public void fileterEmoji() {
09 String s = "<body>口口213这是一个有各种内容的消息, Hia Hia Hia !!!! xxxx@@@...*)!" +
10 "(@*$&@(&#!)@*)!&$!)@^%@(!&#. 口口口], ";
11 String c = Utils.filterEmoji(s);
12 assertFalse(s.equals(c));
13 String expected = "<body>213这是一个有各种内容的消息, Hia Hia Hia !!!! xxxx@@@...*)" +
14 "!(@*$&@(&#!)@*)!&$!)@^%@(!&#. ], ";
15 assertEquals(expected, c);
16 // assertSame(c, expected);
17 assertSame(expected, "<body>213这是一个有各种内容的消息, Hia Hia Hia !!!! xxxx@@@...*)" +
18 "!(@*$&@(&#!)@*)!&$!)@^%@(!&#. ], ");
19 assertSame(c, Utils.filterEmoji(c));
20 }
21
22 }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
蚂蚁泡酒适合哪些人喝 蚂蚁酒的功效与禁忌蚂蚁酒的功效与作用 热血无赖卡怎么办 了解这两方面内容 益生菌孕妇 孕妇能喝益生菌吗 羽毛球双打底线是内线还是外线 为什么泰国两位尊者有不死之身 秦始皇活了多少岁?当了几年皇帝? DELL电脑D630.PP18L2手机。才用了4个多月。多少钱我可以买呢,麻烦谁说... dellpp18l现在买多少钱 请大家列举一下杭州市内的专科学校!!急!! 联通畅想卡每月100G流量有没有这回事? 还是全国通用的网上中国联通每月一百G流量卡是什么鬼? 联通的有没有一个卡16块钱月租,100G的流量? 临沭县蛟龙供销社诚信粉丝厂怎么样? 雷凌双擎维修模式怎样启动 临沭县蛟龙供销社怎么样? 享域混动版改了那些?和雷凌双擎相比怎么样? 蛟龙600 水上飞机 新双擎雷凌值得购买吗? 临沭县蛟龙镇有多少个村? 雷凌双擎drivemode按钮是什么意思 雷凌双擎和雷凌双擎E+有什么区别? 丰田雷凌双擎这个油电混合动力版的是否需要插电充电? 混动雷凌使用5年了总是自动切换燃油 双擎版雷凌动力弱?那是你没踩到位!试全新雷凌双擎 雷凌双擎E+在雷凌的基础上做了哪些方面的改进呢? 广汽丰田的雷凌双擎采用的技术真的很牛*吗?试驾使用感受怎么样? 2021款雷凌双擎4s店升级carlife 苹果手机怎样解除绑定微信? 为什么老是口腔溃疡? 经常口腔溃疡,是哪些原因导致的? 我最近经常出现口腔溃疡,可能是什么原因导致的? 是什么原因导致经常口腔溃疡呢,反复性的。 经常口腔溃疡,是什么原因导致的? 每隔一段时间嘴里就会长口腔溃疡,可能是什么原因导致的? 经常出现口腔溃疡,到底是什么原因导致的? 口腔溃疡是因为什么引起的? 口腔溃疡的原因-经常口腔溃疡是怎么回事? 经常性长口疮,不知道什么原因? 五岳背诵口诀是什么? 如何记五岳 李杜指什么三苏指什么文房四宝是什么五岳是什么 男宝,正月二十六,凌晨5.50出生,五行喜用神属土,取个什么名字, 五岳是那些指那些山 中国五岳分别是什么岳对什么山?十大将军又叫啥名? 男宝2018年10月4日(阴历八月二十五)早上8:45出生 五行土多 喜用神是水 应该起什么名字 姓郭 谢谢大神 如何能快速背出梦游天姥吟留别 三山五岳的物质基础 炖牛肉时水放少了导致牛肉变硬,这种情况下有哪些补救方法?