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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求php过滤ios的Emoji表情的方法,如果字符串中包含Emoji表情就删除。相关的知识,希望对你有一定的参考价值。

参考技术A 网上已经有开源的了!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

PHP开发中涉及到emoji表情的几种处理方法

最近几个月做微信开发比较多,存储微信昵称必不可少
可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了

一般Mysql表设计时,都是用UTF8字符集的。把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串。这是怎么回事呢?

原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了。这要怎么办呢?我来介绍几种方法

1、使用utf8mb4字符集


如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集
这种4字节的utf8编码可完美兼容旧的3字节utf8字符集,并且可以直接存储emoji表情,是最好的解决方案
至于字节增大带来的性能损耗,我看过一些评测,几乎是可以忽略不计的

2、使用base64编码


如果你因为某些原因无法使用utf8mb4的话,你还可以使用base64来曲线救国
使用例如base64_encode之类的函数编码过后的emoji可以直接存储在utf8字节集的数据表中,取出时decode一下即可

3、干掉emoji表情


emoji表情是个麻烦的东西,即使你能存储,也不一定能完美显示。在iOS以外的平台上,例如PC或者android。如果你需要显示emoji,就得准备一大堆emoji图片并使用第三方前端类库才行。即便如此,还是可能因为emoji图片不够全而出现无法显示的情况
在大多数业务场景下,emoji也不是非要不可的。我们可以适当地考虑干掉它,节约各种成本

经过一番苦苦的google,终于找到靠谱能用的代码:

// 过滤掉emoji表情
function filterEmoji($str)
{
    $str = preg_replace_callback(
            ‘/./u‘,
            function (array $match) {
                return strlen($match[0]) >= 4 ? ‘‘ : $match[0];
            },
            $str);

     return $str;
 }
基本思想就是遍历字符串中的每个字符,如果该字符的长度为4个字节,就将其删除。
转载自:pein0119







以上是关于求php过滤ios的Emoji表情的方法,如果字符串中包含Emoji表情就删除。的主要内容,如果未能解决你的问题,请参考以下文章

php过滤表单输入的meoji表情

使用php过滤emoji表情

Python string中删除(过滤)掉emoji表情字符

php过滤处理手机自带Emoji表情

python 怎么过滤 emoji 表情符号

python emoji 表情过滤