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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值