Emoji 表情在Java代碼中處理api

客戶端提交帶有emoji表情字符串一般會有如下處理       

注: 文中的所有表和編碼不對應,原因:在eclipse中編輯的表情在該處不能正常顯示,所有就隨便用了個當前編輯器的表情

         (表情字符串  是  客戶端提交到server 的數據使用String 變量接收的值  一般utf8編碼 )

1、判斷字符串是否是表情

2、獲取字符串的所有表情字符串  或  所有非表情字符串

3、將表情字符串轉成 HtmlDecimal  如:微笑 ->    ;#128516;

4、將表情字符串轉成 Hexadecimal  如 :微笑 ->  ;#x1f466;

5、將表情字符串轉成Unicode

6、  (3,4,5)的翻轉

7、表情語義分析


解決思路:

1、需要有一張 emoji 表情 、htmlDecimal  、 hexadecimal 、 語義映射表

2、有了數據表,剩下的就是API的處理了 , O(∩_∩)O哈哈~


正好在github 有該jar包和數據  

<dependency>
 <groupId>com.vdurmont</groupId>
 <artifactId>emoji-java</artifactId>
 <version>3.1.3</version>
</dependency>

該jar包中有個emojis.json的文件就是上面提到的映射表  結構如下:

{
    "emoji": "微笑",
    "description": "smiling face with open mouth and smiling eyes",
    "aliases": [
      "smile"
    ],
    "tags": [
      "happy",
      "joy",
      "pleased"
    ]
  },  ............

可以看到 json 數據中有 語義和標籤  ,HtmlDecimal  和 Hexadecimal   經過EmojiLoader : :loadEmojis 解析之後就有了(jar包中總共之後6個Java文件)

問題1、 3 、 4 、6  EmojiParser  ,  EmojiManager  能找到對應的函數 

大家可以看源碼 或者  https://github.com/vdurmont/emoji-java  

問題5如下

	public static String getUnicode(String source){
		 String returnUniCode=null;
		 String uniCodeTemp=null;
		 for(int i=0;i<source.length();i++){
		  uniCodeTemp = "\\u"+Integer.toHexString((int)source.charAt(i));
		  returnUniCode=returnUniCode==null?uniCodeTemp:returnUniCode+uniCodeTemp;
		 }
		 return returnUniCode;
	}

問題2是自己當時在 EmojiParser  中擴展的 兩個函數  如下:

/**
   * 獲取非表情字符串
   * @param input
   * @return
   */
  public static String getNonEmojiString(String input) {
	    int prev = 0;
	    StringBuilder sb = new StringBuilder();
	    List<UnicodeCandidate> replacements = getUnicodeCandidates(input);
	    for (UnicodeCandidate candidate : replacements) {
	      sb.append(input.substring(prev, candidate.getEmojiStartIndex()));
	      prev = candidate.getFitzpatrickEndIndex();
	    }
	    return sb.append(input.substring(prev)).toString();
  }
  
  /**
   * 獲取表情字符串
   * @param input
   * @return
   */
  public static String getEmojiUnicodeString(String input){
	    EmojiTransformer  transformer = new EmojiTransformer() {
	      public String transform(UnicodeCandidate unicodeCandidate) {
	           return unicodeCandidate.getEmoji().getHtmlHexadecimal();
	      }
	    };
	    StringBuilder sb = new StringBuilder();
	    List<UnicodeCandidate> replacements = getUnicodeCandidates(input);
	    for (UnicodeCandidate candidate : replacements) {
	      sb.append(transformer.transform(candidate));
	    }
	    return  parseToUnicode(sb.toString());
  }

運行測試如下:

String str = "aaaa

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章