知识点
相关文章
更多最近更新
更多[11] 微信公众帐号开发教程第11篇-符号表情的发送(上)
2019-03-02 00:11|来源: 网路
题外话(可以略过)
相信这篇文章已经让大家等的太久了,不是我故弄玄虚、吊大家胃口,而是写一篇文章真的需要花太多的时间。也许一篇文章,你们花3-5分钟就看完了、就学会掌握了,而我却要花2-3个小时的时间来完成,也许只有用心写过文章的人才能体会,希望大家能够相互体谅!
也曾经有人对我说,我写的东西太初级,都是入门级的东西。好吧,我承认众口难调,很难满足所有的读者,再加上我自己也只是个新手,一个4月前才听说微信公众平台这个词的初学者,谢谢你们以不同方式对我的激励,我会更加努力的!
第9篇文章介绍了QQ表情的发送与接收。在此之后,很多朋友问我如何发emoji表情(微信上叫符号表情),也就让我有了写这篇文章的决心。在此之前,我在网上进行了大量的搜索,发现根本没有介绍这方面的文章,并且在微信公众帐号开发官方交流群里提问,也少有人知道该如何发送emoji表情。今天,就让我们一起来揭开它的神秘面纱!
文章概要
本文重点介绍如何在微信公众帐号开发模式下,通过程序代码向用户发送符号表情。至于如何识别用户发送的是符号表情,就不在此讲解了,留给大家一点学习思考的空间。我只是给大家一个提示:用户向公众帐号发送符号表情,其实也是一条文本消息,这与QQ表现是一样的,即然是文本消息,将接收的符号表情内容打印到日志,不就知道每个表情对应的文本了吗?呵呵,当然也没有这么简单,并不是像其他文本消息,这里需要对接收到符号表情消息先做编码的转换。好了,就提示这么多。
认识符号表情
在公众帐号的主交互界面,窗口底部的输入框旁边有一个笑脸的图片按钮,点击它将会弹出表情选择界面,可选择的表情依次为“QQ表情”、“符号表情”和“动画表情”,我们选择“符号表情”,将会看到如下图所示界面:
可以持看出,相比QQ表情,符号表情要更加实用。为什么这么说呢?因为QQ表情大都是脸部表情,而符号表情除了脸部表情外,还有很多与生活息息相关的表情,例如:动物、花朵、树木、电视、电话、电脑、吉它、球类、交通工具等等。如果能在消息中使用符号表情,会不会显得更加生动、有趣呢?
再来看看小q机器人中使用符号表情的效果,先上两张图:
左边截图是小q机器人的主菜单,在Q友圈文字旁边的那个表情就是符号表情,是一女一男两人小朋友,示意着在Q友圈里可以结识到更多的朋友,不要想歪了,^_^。右边截图是人脸识别功能的使用指南,里面的“相机”、“鬼脸”也是符号表情,这样看上去是不是更加有趣味性呢?如果是纯文本,一定会显得太单调、太枯燥了。
Emoji表情的分类
Emoji表情有很多种版本,包括Unified、DoCoMo、KDDI、Softbank和Google,而且不同版本的表情代码也不一样,更可恶的是:不同的手机操作系统、甚至是同一操作系统的不同版本所支持的emoji表情又不一样。所以,完美主义者可以止步了,因为目前emoji表情并不能保证在所有终端上都能正常使用。
庆幸的是,我已经在超过10余部终端上测试过emoji表情的使用,这其中包括iPhone 4S、iPhone 5、Android 2.2、Android 4.0+、Win8、iPad2,只有极个别终端上显示不出来或显示为一个小方格,所以并没有什么太大的影响,也就可以放心使用了!
Emoji表情代码表之Unified版本
上面介绍的几种版本的emoji表情,都是通过unicode编码来表示的。换言之,不同版本的emoji表情对应的unicode编码值也不一样。本篇文章,我先给出Unified版本emoji表情的代码表,如下图所示:
公众帐号如何向用户发送emoji表情
上面已经给出了emoji表情的unified unicode代码对照表,那么这些代码要如何使用,才能发送出对应的emoji表情呢?如果你只是简单的像使用QQ表情代码那样,直接在文本消息的Content里写emoji表情代码,一定是会原样显示的。
这里需要用到一个Java方法做转换处理,方法的代码如下:
/** * emoji表情转换(hex -> utf-16) * * @param hexEmoji * @return */ public static String emoji(int hexEmoji) { return String.valueOf(Character.toChars(hexEmoji)); }
方法说明:例如,“自行车”的unicode编码值为U+1F6B2,如果我们要在程序代码中使用“自行车”这个emoji表情,需要这样使用:
String bike = String.valueOf(Character.toChars(0x1F6B2));
其实前面那个emoji()方法就是对上面这行代码做了个简单的封装而以。现在知道如何使用emoji表情代码了吧,其实就是将代码表中的U+替换为0x,再调用emoji方法进行转换,将转换后的结果放在文本消息的Content中,返回给用户就会显示emoji表情了。
下面,我给出一个使用emoji表情的完整示例,如下:
package org.liufeng.course.service; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.liufeng.course.message.resp.TextMessage; import org.liufeng.course.util.MessageUtil; /** * 核心服务类 * * @author liufeng * @date 2013-05-20 */ public class CoreService { /** * 处理微信发来的请求 * * @param request * @return */ public static String processRequest(HttpServletRequest request) { String respMessage = null; try { // xml请求解析 Map<String, String> requestMap = MessageUtil.parseXml(request); // 发送方帐号(open_id) String fromUserName = requestMap.get("FromUserName"); // 公众帐号 String toUserName = requestMap.get("ToUserName"); // 回复文本消息 TextMessage textMessage = new TextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(new Date().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); textMessage.setFuncFlag(0); textMessage.setContent("自行车" + emoji(0x1F6B2) + " 男性" + emoji(0x1F6B9) + " 钱袋" + emoji(0x1F4B0)); respMessage = MessageUtil.textMessageToXml(textMessage); } catch (Exception e) { e.printStackTrace(); } return respMessage; } /** * emoji表情转换(hex -> utf-16) * * @param hexEmoji * @return */ public static String emoji(int hexEmoji) { return String.valueOf(Character.toChars(hexEmoji)); } }
上面代码的作用是:不管用户发送什么类型的消息,都返回包含三个emoji表情的文本消息。如果不明白CoreService类怎么回事,请查看本系列教程的第5篇,或者你只需要认真看第42行代码,就知道怎么样把emoji表情代码放在文本消息的Content中了。最后再来看下运行效果截图:
本篇文章要讲的内容就至此结束了,但关于emoji表情的讲解还没有结束,为什么这么说呢?请仔细看本篇文章的第二张截图,也就是小q机器人的文本菜单,里面用到的emoji表情在本文给出的emoji代码表里根本找不到(微信上的emoji表情与代码表中完全一致),那这个emoji表情又是如何发送的呢,请听下回分解!
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot来支持柳峰哦!
转帖请注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),请尊重他人的辛勤劳动成果,谢谢!
转自:http://my.oschina.net/crossbell/blog/277783
相关问答
更多-
suse linux 11 连接问题[2023-07-13]
看这个网站的教程上是怎么设置的: http://www.zhiweinet.com/linux/ -
MySQL中,int(11)的11是什么意思?[2023-06-21]
int(M) M指示最大显示宽度。最大有效显示宽度是255。 java中int变量和C语言中int变量的取值范围不一样原因: 1、java 中 int总是4字节,但是C不一样。 2、在16位C编译器中,int是2字节,在32为C编译器中int为32位,在64位C编译器中int为8字节,C语言规定,int型是目标设备(16位或32位或64位CPU的机器等等)最适宜(不是最适宜也至少是挺适宜)的整数类型,且至少要2字节。 3、也不能简单说取决于电脑,而应该说取决于编译为多少位的程序,编译为16位的基本就2字节, ... -
int(11)与int(其他)(int(11) vs. int(anything else))[2022-03-17]
INT(x)中的INT(x)与空间要求或任何其他性能问题无关,它仅仅是显示宽度 。 通常将显示宽度设置为合理值对于UNSIGNED ZEROFILL选项非常有用。 //INT(4) UNSIGNED ZEROFILL 0001 0002 ... 0099 ... 0999 ... 9999 ... 10000 //INT(2) UNSIGNED ZEROFILL 01 02 ... 09 ... 99 ... 100 如果没有UNSIGNED ZEROFILL选项,该值将被填充空格以适当的显示宽度。 ... -
UNSIGNED类型不能为负,但另一方面它的正整数的范围是两倍。 类型TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT都有签名和无符号版本。 对于INT,范围定义如下: Type Storage Min Max INT 4 -2147483648 2147483647 INT UNSIGNED 4 0 4294967295 有符号和无符号类型占用相同 ...
-
为什么在JavaScript中“1”+ +“1”=“11”,但“1” - - “1”= 2(Why is “1” + + “1” = “11” but “1” - - “1” = 2 in JavaScript)[2021-11-21]
-运算符对字符串没有意义,所以它将该值转换为一个Number 。 the - operator has no meanings on strings, so it converts the value to a Number. -
我希望您使用的是WebRTC适配器,它有助于标准化API以执行这些任务。 Temasys有自己的适配器,它构建在WebRTC适配器之上,并在保留类似接口的同时为其插件添加支持。 因此,MediaStream和其他东西也将在IE上受支持,因为它是由该适配器库定义的。 WebRTC AdapterJS: https : //github.com/webrtc/adapter Temasys AdapterJS: https : //github.com/Temasys/AdapterJS 我希望这能解决你的问题 ...
-
-11从哪里来的?(Where did this -11 came from?)[2022-10-15]
您正在递归到recaller ,所以x在递归结束时递减很多次 - 每次递归时,当您退出递归调用while将再次检查while循环条件,并且该表达式递减x 。 考虑一下如果我们从x = 2开始会发生什么: x是2,我们称之为recaller (第一次)进入它的while循环,它检查x是否大于零,递减和... x是1,我们称recaller (第二次)进入它的while循环,它检查x是否大于零,递减和... x是0,我们调用recaller (第三次)进入它的while循环,它检查x是否大于零,它不是 ,递减( ... -
您应该能够使用document.body.scrollTop找到它。 要使其向后(或IE)兼容,请尝试以下操作: var scrollTop = window.scrollY || document.body.scrollTop || 0; 然后使用scrollTop作为变量。 You should be able to find it using document.body.scrollTop. To make it backwards (or IE) compatible, try this: var ...
-
IE 11问题(Issue with IE 11)[2020-01-28]
在IE中使用:before和:after有一个问题(我不知道是什么)。 从技术上讲,它们是伪代码,所以IE必须比其他浏览器更严格地遵守标准。 在IE11中,我通过将html类更改为copyright来实现它的工作:Copyright © 2016 Avmark Systems. Powered b ...正如文档中所述: Api等级5: public AbstractThreadedSyncAdapter (Context context, boolean autoInitialize) Api等级11: public AbstractThreadedSyncAdapter (Context context, boolean autoInitialize, boolean allowParallelSyncs) 所以你只需要实现两个构造函数,然后调用一个或另一个: if (sSyncAdapter == ...