IOS或者Android传递 含有emoji表情的文本到服务器之php处理方式

Emoji表情的分类

Emoji表情有很多种版本,包括Unified、DoCoMo、KDDI、Softbank和Google,而且不同版本的表情代码也不一样,更可恶的是:不同的手机操作系统、甚至是同一操作系统的不同版本所支持的emoji表情又不一样。所以,完美主义者可以止步了,因为目前emoji表情并不能保证在所有终端上都能正常使用。

微信接口中对于emoji表情使用的是UTF-8的二进制字符串,并没有解码,表现就是当收到微信端用户发来的emoji表情时,显示为一个方块型「」或是无法显示的字符,这时就需要对其进行转码。同理在向微信服务器发送带有emojib表情的文本消息时,也需要将表情字符编码为此格式进行发送(早前微信可以直接发送unicode码显示emoji表情,但是现在已经不支持了)。

每个emoji表情其实都有相应的unicode编码,在解析用户向公众号发送的文字中的emoji表情字符时,我们可以根据unicode码来匹配或存储信息中的emoji表情;同理在向用户发送包含emoji表情的文字消息时,则将表情字符根据unicode编码进行二进制转码后再发送。这里推荐使用softbank版本的emoji编码进行unicode转换,例如,”U+E04A” 转换为 “\ue04a”,与微信匹配。

处理方式:

1,在收到一段可能含有emoji表情的文本内容后,可以简单的使用 json_encode($str) 将其进行JSON编码,此时消息中的表情、中文等字符将会被转为unicode编码显示。(这里进行JSON编码就是为了获得字符的unicode码,所以json_encode函数中不需要增加避免unicode的可选参数了)。

例如: “你好  hello 123″ 将被编码为” \u4f60\u597d \ue415 hello 123 “

字符中的\ue415就是一个emoji表情,此时我们就可以对字符进行正则判断来筛选出哪些是emoji表情了。我的做法是把emoji的unicode字符串反斜杠转义,然后再将字符json_decode还原,这样就可以将除了emoji之外的字符还原(不会影响到中文等其他字符),只留下emoji的unicode码。

你也可以用别的方法,比如做一个标记和替换,例如将”\ue415″替换为”[em:ue415]“,类似于QQ表情的做法,在需要显示文本和表情的时候,就可以方便的对表情字符做出匹配渲染。或者也可以直接把他替换成HTML的img标签把表情图片存进去,但是这样不利于维护。

我使用的正则粗暴简单,选择了 ue000 – uefff 之间的字符视为emoji,暂时没有发现误伤:

  1. $str = preg_replace("#(\\\ue[0-9a-f]{3})#ie","addslashes('\\1')",$str); 

整个过程完整代码如下:

  1. $text = "你好  hello 123"//可以为收到的微信消息,可能包含二进制emoji表情字符串 
  2. $tmpStr = json_encode($text); //暴露出unicode 
  3. $tmpStr = preg_replace("#(\\\ue[0-9a-f]{3})#ie","addslashes('\\1')",$tmpStr); //将emoji的unicode留下,其他不动 
  4. $text = json_decode($tmpStr); 
  5.   
  6. echo $text;//你好 \ue415 hello 123 
之后就可以存储信息了,在读取出信息到页面的时候就可以进行字符替换和模板渲染了.

下面是发送部分,就更简单了:
 
对于一条包含emoji的文本消息,可以先放入其unicode字符,还是拿刚才的这段来举例子:”你好 \ue415 hello 123 “。
 
然后使用正则筛选出文本中的emoji unicode,对其进行二进制pack,UTF8转码,再放入原文本中即可(这一步应该在消息发送前最后来做,先准备好完整的文本消息再进行转码处理)。代码如下:
 
 
 
 
 
  1. $text = "你好 \ue415 hello 123"//可以为将要发送的微信消息,包含emoji表情unicode字符串,需要转为utf8二进制字符串 
  2. $text = preg_replace("#\\\u([0-9a-f]+)#ie","iconv('UCS-2','UTF-8', pack('H4', '\\1'))",$text); //对emoji unicode进行二进制pack并转utf8 
  3.   
  4. echo $text;//你好  hello 123 
这样就可以对微信服务器发送了。
 
附上我使用的emoji unicode的编码数据表:mc-zone/emoji-code,数据中增加了根据softbank编码转换的unicode值(softb_unicode字段),可以和微信中使用的相匹配。
表情的数据和css样式名参考了这个项目:github.com/iamcal/php-emoji ,可以结合使用。
2,php-emoji 是个 PHP 库用来处理和转换 Emoji 表情的。

<?php
     include ( 'emoji.php' );
 
 
     # when you recieve text from a mobile device, convert it
     # to the unified format.
 
     $data = emoji_docomo_to_unified( $data );   # DoCoMo devices
     $data = emoji_kddi_to_unified( $data );     # KDDI & Au devices
     $data = emoji_softbank_to_unified( $data ); # Softbank & pre-iOS6 Apple devices
     $data = emoji_google_to_unified( $data );   # Google Android devices
 
 
     # when sending data back to mobile devices, you can
     # convert back to their native format.
 
     $data = emoji_unified_docomo( $data );   # DoCoMo devices
     $data = emoji_unified_kddi( $data );     # KDDI & Au devices
     $data = emoji_unified_softbank( $data ); # Softbank & pre-iOS6 Apple devices
     $data = emoji_unified_google( $data );   # Google Android devices
 
 
     # when displaying data to anyone  else , you can  use HTML
     # to format the emoji.
 
     $data = emoji_unified_to_html( $data );
 
     if you want to  use an editor(i.e:wysiwyg) to create the content,
     # you can  use html_to_unified to store the unified value.
 
     $data = emoji_html_to_unified(emoji_unified_to_html( $data ));
?>

项目主页:http://www.open-open.com/lib/view/home/1403409359422


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值