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包和数据  


 com.vdurmont
 emoji-java
 3.1.3

该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

问题2是自己当时在 EmojiParser  中扩展的 两个函数  如下:

/**
   * 获取非表情字符串
   * @param input
   * @return
   */
  public static String getNonEmojiString(String input) {
	    int prev = 0;
	    StringBuilder sb = new StringBuilder();
	    List 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 replacements = getUnicodeCandidates(input);
	    for (UnicodeCandidate candidate : replacements) {
	      sb.append(transformer.transform(candidate));
	    }
	    return  parseToUnicode(sb.toString());
  }

运行测试如下:

String str = "aaaa

你可能感兴趣的:(小技术点)