二十一:微信公衆帳號開發-符號表情的發送(上)

此篇文章爲轉載


題外話(可以略過)

相信這篇文章已經讓大家等的太久了,不是我故弄玄虛、吊大家胃口,而是寫一篇文章真的需要花太多的時間。也許一篇文章,你們花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方法做轉換處理,方法的代碼如下:

[java] view plaincopy
  1. /** 
  2.  * emoji表情轉換(hex -> utf-16) 
  3.  *  
  4.  * @param hexEmoji 
  5.  * @return 
  6.  */  
  7. public static String emoji(int hexEmoji) {  
  8.     return String.valueOf(Character.toChars(hexEmoji));  
  9. }  

方法說明:例如,“自行車”的unicode編碼值爲U+1F6B2,如果我們要在程序代碼中使用“自行車”這個emoji表情,需要這樣使用:

[java] view plaincopy
  1. String bike = String.valueOf(Character.toChars(0x1F6B2));  

其實前面那個emoji()方法就是對上面這行代碼做了個簡單的封裝而以。現在知道如何使用emoji表情代碼了吧,其實就是將代碼表中的U+替換爲0x,再調用emoji方法進行轉換,將轉換後的結果放在文本消息的Content中,返回給用戶就會顯示emoji表情了。

下面,我給出一個使用emoji表情的完整示例,如下:

[java] view plaincopy
  1. package org.liufeng.course.service;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7.   
  8. import org.liufeng.course.message.resp.TextMessage;  
  9. import org.liufeng.course.util.MessageUtil;  
  10.   
  11. /** 
  12.  * 核心服務類 
  13.  *  
  14.  * @author liufeng 
  15.  * @date 2013-05-20 
  16.  */  
  17. public class CoreService {  
  18.     /** 
  19.      * 處理微信發來的請求 
  20.      *  
  21.      * @param request 
  22.      * @return 
  23.      */  
  24.     public static String processRequest(HttpServletRequest request) {  
  25.         String respMessage = null;  
  26.         try {  
  27.             // xml請求解析  
  28.             Map<String, String> requestMap = MessageUtil.parseXml(request);  
  29.   
  30.             // 發送方帳號(open_id)  
  31.             String fromUserName = requestMap.get("FromUserName");  
  32.             // 公衆帳號  
  33.             String toUserName = requestMap.get("ToUserName");  
  34.   
  35.             // 回覆文本消息  
  36.             TextMessage textMessage = new TextMessage();  
  37.             textMessage.setToUserName(fromUserName);  
  38.             textMessage.setFromUserName(toUserName);  
  39.             textMessage.setCreateTime(new Date().getTime());  
  40.             textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);  
  41.             textMessage.setFuncFlag(0);  
  42.             textMessage.setContent("自行車" + emoji(0x1F6B2) + " 男性" + emoji(0x1F6B9) + " 錢袋" + emoji(0x1F4B0));  
  43.             respMessage = MessageUtil.textMessageToXml(textMessage);  
  44.         } catch (Exception e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.   
  48.         return respMessage;  
  49.     }  
  50.   
  51.     /** 
  52.      * emoji表情轉換(hex -> utf-16) 
  53.      *  
  54.      * @param hexEmoji 
  55.      * @return 
  56.      */  
  57.     public static String emoji(int hexEmoji) {  
  58.         return String.valueOf(Character.toChars(hexEmoji));  
  59.     }  
  60. }  

上面代碼的作用是:不管用戶發送什麼類型的消息,都返回包含三個emoji表情的文本消息。如果不明白CoreService類怎麼回事,請查看本系列教程的第5篇,或者你只需要認真看第42行代碼,就知道怎麼樣把emoji表情代碼放在文本消息的Content中了。最後再來看下運行效果截圖:

本篇文章要講的內容就至此結束了,但關於emoji表情的講解還沒有結束,爲什麼這麼說呢?請仔細看本篇文章的第二張截圖,也就是小q機器人的文本菜單,裏面用到的emoji表情在本文給出的emoji代碼表里根本找不到(微信上的emoji表情與代碼表中完全一致),那這個emoji表情又是如何發送的呢,請聽下回分解!

 

如果覺得文章對你有所幫助,請通過留言或關注微信公衆帳號xiaoqrobot來支持柳峯哦!

謝謝柳峯老師:轉載地址:http://blog.csdn.net/lyq8479/article/details/9229637
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章