`
Luob.
  • 浏览: 1571731 次
  • 来自: 上海
社区版块
存档分类
最新评论

emoji 表情图片解决方法

阅读更多
1:先弄到图片 上传到服务器上




2.下载 unicode 和 表情 映射关系xml
   emoji4unicode.xml  在下面的rar 中

3.加入这个一个 转换类
package com.fanbaobao.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public class EmojiConverter {

	private EmojiConverter() {
	}

	enum Type {
		UNICODE, SOFTBANK
	};

	private Map<List<Integer>, String> convertMap;

	public static class Builder {

		private Type from;
		private Type to;

		public Builder from(Type type) {
			this.from = type;
			return this;
		}

		public Builder to(Type type) {
			this.to = type;
			return this;
		}

		public EmojiConverter build() {
			EmojiConverter converter = new EmojiConverter();
			readMap(converter);
			return converter;
		}

		private static final String TRIM_PATTERN = "[^0-9A-F]*";

		public void readMap(EmojiConverter converter) {
			Map<List<Integer>, String> result = new HashMap<List<Integer>, String>();
			converter.convertMap = result;

			XMLEventReader reader = null;
			try {

				XMLInputFactory factory = XMLInputFactory.newInstance();

				InputStream stream = EmojiConverter.class.getClassLoader()
						.getResourceAsStream("emoji4unicode.xml");
				reader = factory.createXMLEventReader(stream);

				while (reader.hasNext()) {
					XMLEvent event = reader.nextEvent();

					if (event.isStartElement()) {
						StartElement element = (StartElement) event;
						if (element.getName().getLocalPart().equals("e")) {

							Attribute fromAttr = element
									.getAttributeByName(new QName(from.toString().toLowerCase()));
							Attribute toAttr = element
									.getAttributeByName(new QName(to.toString()
											.toLowerCase()));
							if (fromAttr == null) {
								continue;
							}
							List<Integer> fromCodePoints = new ArrayList<Integer>();
							String from = fromAttr.getValue();
							if (from.length() > 6) {
								String[] froms = from.split("\\+");
								for (String part : froms) {
									fromCodePoints.add(Integer.parseInt(
											part.replaceAll(TRIM_PATTERN, ""),
											16));
								}
							} else {
								fromCodePoints.add(Integer.parseInt(
										from.replaceAll(TRIM_PATTERN, ""), 16));
							}
							if (toAttr == null) {
								result.put(fromCodePoints, null);
							} else {
								String to = toAttr.getValue();
								StringBuilder toBuilder = new StringBuilder();
								if (to.length() > 6) {
									String[] tos = to.split("\\+");
									for (String part : tos) {
										toBuilder.append(Character
												.toChars(Integer.parseInt(part
														.replaceAll(
																TRIM_PATTERN,
																""), 16)));
									}
								} else {
									toBuilder.append(Character.toChars(Integer
											.parseInt(to.replaceAll(
													TRIM_PATTERN, ""), 16)));
								}
								result.put(fromCodePoints, toBuilder.toString());
							}

						}
					}
				}

				reader.close();
			} catch (Exception e) {
				e.printStackTrace();

			} finally {
				if (reader != null) {
					try {
						reader.close();
					} catch (XMLStreamException e) {

					}
				}

			}

		}

	}

	public String convert(int width,int height,String imgpath,String input) {
		StringBuilder result = new StringBuilder();
		int[]codePoints = toCodePointArray(input);
		for(int i = 0; i < codePoints.length; i++){
			List<Integer> key2 = null;
			if(i + 1 < codePoints.length){
				key2 = new ArrayList<Integer>();
				key2.add(codePoints[i]);
				key2.add(codePoints[i + 1]);
				
				if(convertMap.containsKey(key2) || 65039==codePoints[i + 1]){  //处理 iphone5 xxxx-fe0f.png
					String aa=Integer.toHexString(codePoints[i])+"-"+Integer.toHexString(codePoints[i+1]);
					String value = convertMap.get(key2);
					if(value != null || 65039==codePoints[i + 1]){
						result.append("<img width=\""+width+"px\" height=\""+height+"px\" style=\"vertical-align: bottom;\" src=\""+imgpath+"");
						result.append(aa);
						result.append(".png\"/>");
					}
					i++;
					continue;
				}
			}
			
			List<Integer> key1 = new ArrayList<Integer>();
			key1.add(codePoints[i]);
			if(convertMap.containsKey(key1)){
				String aa=Integer.toHexString(codePoints[i]);
				String value = convertMap.get(key1);
				if(value != null){
					result.append("<img width=\""+width+"px\" height=\""+height+"px\" style=\"vertical-align: bottom;\" src=\""+imgpath+"");
					result.append(aa);
					result.append(".png\"/>");
					//System.out.println("key:"+key1);
					//System.out.println("Map:"+value);
				}
				continue;
			}
			if(128529==codePoints[i]){  //处理空格
				result.append(" ");
				continue;
			}
			result.append(Character.toChars(codePoints[i]));
			
		}
		return result.toString();
	}
 
	int[] toCodePointArray(String str) {
		char[] ach = str.toCharArray();
		int len = ach.length;
		int[] acp = new int[Character.codePointCount(ach, 0, len)];
		int j = 0;

		for (int i = 0, cp; i < len; i += Character.charCount(cp)) {
			cp = Character.codePointAt(ach, i);
			acp[j++] = cp;
		}
		return acp;
	}

}


3.调用 servlet
public class ShareServlet extends HttpServlet {
	
	private static EmojiConverter converter;
	private static String imgpath="http://xx.xxxx.com/opt/siteimg/mika/emoji/unicode/";
	@Override
	public void init() throws ServletException {
		converter = new EmojiConverter.Builder()
		.from(Type.UNICODE)
		.to(Type.SOFTBANK)
		.build();
	}

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		FbbServiceClient service=null;
		try {
			String userid=request.getParameter("userid");
			String bid=request.getParameter("bid");
			if(userid!=null && bid!=null && userid.length()>0 && bid.length()>0){
				service=new FbbServiceClient();
				SnapService.Client client=service.open();
				SnapItem item=client.getItemByIdS(Long.valueOf(userid),Long.valueOf(bid));
				//进行转换
				if(item.getUserName()!=null && item.getUserName().length()>0)
					item.setUserName(converter.convert(20,20,imgpath,item.getUserName()));
				if(item.getItemName()!=null && item.getItemName().length()>0)
					item.setItemName(converter.convert(20,20,imgpath,item.getItemName()));
				request.setAttribute("SnapItem", item);
				request.getRequestDispatcher("/wxshare.jsp").forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("errorcode ::: " + e.getMessage(), e);
		}finally{
			if(service!=null)
				service.close();
		}
	}

}


4.写成一个ELfunction 在jsp EL 表达式中 使用
package com.fanbaobao.util;

import com.fanbaobao.util.EmojiConverter.Type;

public class EmojiFunction {
	private static EmojiConverter converter;
	private static String imgpath="http://xx.xxxx.com/opt/siteimg/mika/emoji/unicode/";
	static{
		converter = new EmojiConverter.Builder()
		.from(Type.UNICODE)
		.to(Type.SOFTBANK)
		.build();
	}

	public static String emoji(String arg){
		return emojiFun(null,null,arg);
	}
	
	public static String emojiFun(Integer width,Integer height,String arg){
		if(width==null){
			width=20;
		}
		if(height==null){
			height=20;
		}
		return converter.convert(width.intValue(),height.intValue(),imgpath,arg);
	}
}


5;编写 tld文件
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
	<tlib-version>1.0</tlib-version>
	<short-name>mk</short-name>
	<uri>/mikadata-tags</uri>
	
	<function>  
        <name>emoji</name>
        <function-class>com.fanbaobao.util.EmojiFunction</function-class>  
        <function-signature> 
            java.lang.String emoji(java.lang.String)
        </function-signature>  
    </function>
	
	<function>  
        <name>emojiFun</name>
        <function-class>com.fanbaobao.util.EmojiFunction</function-class>  
        <function-signature> 
            java.lang.String emojiFun(java.lang.Integer,java.lang.Integer,java.lang.String)
        </function-signature>  
    </function>
</taglib>


6:jsp中使用
<%@ taglib uri="/mikadata-tags" prefix="mk"%>

<td>${mk:emoji(dataObject.comment)}</td>
  • 大小: 214 KB
1
0
分享到:
评论
6 楼 白天看黑夜 2017-10-31  
java过滤emoji字符处理,希望能帮到你
http://www.itmayun.com/it/files/226631678709806/article/406117164733730/1.html
5 楼 javer 2016-05-09  
naiyizute 写道
编码表好像不全,能提供全一点的吗

https://raw.githubusercontent.com/googlei18n/emoji4unicode/master/data/emoji4unicode.xml 这里是官方的最全的代码,如果没更新,那也没办法了,只能自己添加了
4 楼 javer 2016-05-09  
你这个 EmojiConverter 是来自这里吧,一个日本人写的 https://github.com/binarywang/emoji-converter/tree/master/src/main/java/u1tnk
3 楼 blankstar 2016-03-14  
  亲测能用..真棒..多谢 多谢....解决了.
2 楼 lxj_717 2015-07-17  
   
1 楼 naiyizute 2015-01-16  
编码表好像不全,能提供全一点的吗

相关推荐

    editor.md中使用的github emoji 表情图片

    editor.md中使用的github emoji 离线表情包图片,用于解决无法加载的问题

    editor-ovo:移动网络的富文本编辑器。 照片和表情符号的混合编辑一个适用于移动网络的富文本编辑器。照片加emoji的混合编辑

    照片和表情符号的混合编辑当前有很多提供emoji表情的编辑器:一类编辑器提供的功能很简单,仅能输入文字和emoji标记(如:$ apple $);还有一种编辑器功能很强大,大多用在pc端,可以呢,没有搜索到比较好用的,能...

    DaenWxHook+千寻VX框架

    支持文本代码,多人艾特,emoji表情,微信表情等,全面解决收发消息、昵称内的emoji表情等特殊字符显示问题。 区别 DaenWxHook是DLL,可以直接注入到微信中,提供HTTPAPI接口,不同的语言,难点在于注入的方式,...

    Emojme: Emoji Anywhere-crx插件

    有两个主要功能:1)将现有的表情符号格式的文本扩展为实际的表情符号,例如将`:parrot:`变成实际上看起来并不像鹦鹉的丑陋的小东西,以及2)搜索并插入丰富的表情符号内容,是否意味着指向emoji表情网址的链接,...

    聊天界面 会话界面(语音,QQ表情,图片)

    语音,动态emoji,相册相机图片(仿QQ和微信图片显示),解决4.4前后相册兼容性问题

    GText:Unity UGUI Text的表情符号和超链接,图文混排,超链接,下划线的UGUI解决方案

    图文混排,超链接,下划线的UGUI解决方案 支持: * 图集动态表情 * 动态加载图片 * 超链接 * 下划线效果 * 自定义加载动画或特效 除动态加载图片,整体只有1个DrawCall 图中4个DC:Unity本身1个,文本整体只有1个,...

    mdm:一款Hexo端优美的MaterialDesign风格主题,简洁,轻巧,麻麻再也不用担心打开博客速度慢了

    升级hexo4.2.0后pwa无法使用, 解决方法看下面。 2020.11.12 解决在IOS设备Safari浏览器上布局错乱问题 2020.10.31 本地化支持 取消缓存head.ejs,解决浏览器顶部Tab卡片中名称错误 优化分享功能 2020-6-20 文章置顶 ...

    小程序代码高亮

    用于解决在微信小程序中Markdown、HTML不能直接... 支持emoji表情wink 支持上标、下标、下划线、删除线、表格、视频、图片(几乎所有html元素)…… 支持typographer字符替换 多主题动态支持 极致的中文排版优化

    Java开源的下一代社区平台Symphony.zip

    Emoji:支持大部分主流 Emoji 表情,快捷键自动补全 数学公式:支持 LaTex 数学公式渲染 数据暂存:支持本地浏览器暂存数据,避免意外情况导致编辑内容丢失 智能、灵活的信息架构 传统的节点式社区要求帖子...

    微信公众平台开发最佳实践 源码及书箱

    10.2 QQ表情和Emoji表情 290 10.3 微信版本及手机系统 293 10.4 Weixin JS接口 295 10.5 发送给朋友与分享到朋友圈 297 10.6 Discuz微社区 299 附录A 关键词自动回复的规则 300 附录B 微信公众平台全局返回码...

    微信公众平台开发最佳实践 源代码

    10.2 QQ表情和Emoji表情 290 10.3 微信版本及手机系统 293 10.4 Weixin JS接口 295 10.5 发送给朋友与分享到朋友圈 297 10.6 Discuz微社区 299 附录A 关键词自动回复的规则 300 附录B 微信公众平台全局返回码...

    小雪配置(正版2019.8.1).rar

    如还有什么疑问,请联系作者询问,在服务范围内能解决的都会解决的。 3 .作者QQ1785987556 一般很少在线,如不在线请留言。 【配置信息修改说明】 1.打开机器人主程序,在主程序左上方找到选择设置,在分目录...

    ThinkSNS开源社交论坛系统 v4.6.1 bulid0630

    和新浪微博类似的微博系统,支持文字、表情、图片、短视频、附件、@、话题,满足用户的交流需求,可以用于任何场景。 微吧(论坛) 结合贴吧论坛圈子等模式的核心点,打造的请论坛系统,圈子化有效资源充分利用,...

    ThinkSNS-PHP

    和新浪微博类似的微博系统,支持文字、表情、图片、短视频、附件、@、话题,满足用户的交流需求,可以用于任何场景。 微吧(论坛) 结合贴吧论坛圈子等模式的核心点,打造的请论坛系统,圈子化有效资源充分利用,...

Global site tag (gtag.js) - Google Analytics