題外話(可以略過)
相信這篇文章已經讓大家等的太久了,不是我故弄玄虛、吊大家胃口,而是寫一篇文章真的需要花太多的時間。也許一篇文章,你們花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),請尊重他人的辛勤勞動成果,謝謝!