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

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  
编码表好像不全,能提供全一点的吗

相关推荐

    Unity开发对Emoji表情包图文混排进行处理显示(支持大多数表情)

    在Unity游戏开发中,涉及到与用户交互的界面时,经常需要处理文本输入,其中包括了越来越多的用户喜欢使用的Emoji表情。本文将深入探讨如何在Unity中处理Emoji表情包,实现图文混排的显示,并确保对大多数表情的支持...

    emoji表情web处理

    在Web开发中,emoji表情已经成为用户交流不可或缺的一部分,特别是在社交网络和聊天应用中。iOS和Android设备用户在输入时会使用各自平台特定的emoji表情符号,这些符号在不同的操作系统和浏览器上可能显示不一致,...

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

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

    Android Emoji 表情开发

    在Android平台上进行应用开发时,Emoji表情的使用已经成为不可或缺的一部分,因为它们能够为用户提供更加生动、直观的交流方式。为了确保在不同设备上提供一致的用户体验,开发者需要关注"Android Emoji表情开发"这...

    微信开发之emoji表情在网页上显示,很好用

    在微信开发过程中,有时我们需要在网页上展示用户发送的emoji表情,这为沟通增添了丰富的表现力。本教程将详细介绍如何在网页中正确显示这些表情,让用户体验更加生动有趣。 首先,我们要理解emoji表情的本质。它们...

    通过jQuery实现的仿QQ Emoji表情包H5插件

    【jQuery实现的仿QQ ...总的来说,"通过jQuery实现的仿QQ Emoji表情包H5插件"是一个综合运用了前端多种技术的实用组件,它提高了用户在Web聊天中的互动性和趣味性,同时也为开发者提供了一个灵活、易用的解决方案。

    emoji表情包转换插件

    总的来说,"emoji表情包转换插件"通过JavaScript技术,解决了网页上emoji图片显示不一致的问题,提升了网页的跨平台兼容性和用户体验。对于前端开发者来说,理解和应用这样的插件有助于创建更友好、更互动的网页应用...

    emoji表情插件

    在IT行业中,尤其是在Web开发领域,"emoji表情插件"是一个常见的工具,它极大地丰富了用户的在线交流体验。本文将详细解析这个主题,探讨表情插件的重要性和具体应用,以及如何在项目中集成和使用此类插件。 首先,...

    jquery实现的emoji表情选择器,

    **jQuery实现的Emoji表情选择器** 在Web开发中,为了增强用户交互体验,尤其是在社交、评论等场景下,经常需要引入emoji表情。`jQuery-emoji-picker`是一个方便的插件,它可以帮助开发者轻松地实现在前端应用中添加...

    在项目中使用Emoji表情【源代码】android

    在Android项目中集成和使用Emoji表情是一个常见的需求,特别是在社交应用、聊天软件或者任何需要用户表达情感的场景中。这个资源包提供了在Android项目中实现Emoji功能的源代码,可以帮助开发者快速实现这一功能。 ...

    Android 软键盘和emoji表情切换方案,和微信几乎一样的体验

    如果是自定义图片,可能需要额外的处理,例如使用SpannableString和ImageSpan来显示表情图片。 4. **优化用户体验** - 为了提供与微信类似的体验,可以添加滑动手势来切换表情页,这需要监听滑动事件并更新当前...

    android emoji表情 IM功能的集成

    本文将深入探讨如何在Android项目中实现emoji表情的集成,包括基本原理、关键步骤以及可能遇到的问题和解决方案。 首先,我们需要理解emoji表情在Android系统中的表现形式。在Android上,emoji通常是以Unicode编码...

    Java Emoji Converter表情转换工具

    这个工具的目的是帮助开发者解决在处理含有Emoji的文本时遇到的兼容性挑战。 在Java编程语言中,处理Emoji可能会涉及到Unicode编码、字体映射以及平台特定的实现。Java Emoji Converter提供了一个统一的接口,允许...

    3种方法轻松处理php开发中emoji表情的问题

    为了解决这一问题,文章介绍了三种处理emoji表情的方法: 方法一:使用utf8mb4字符集 utf8mb4是MySQL提供的一个字符集,它能够支持最多四个字节的UTF-8编码,这样就能够兼容emoji表情的编码。如果MySQL的版本是...

    Android-这是一款高度自定义的emoji表情实现方案

    4. **数据结构与编码**:emoji表情通常有两种表示方式:Unicode编码和图片资源。为了便于处理,我们可以创建一个数据结构(如`HashMap`)来存储emoji的Unicode和对应的图片资源ID。这样,在用户输入时,我们可以根据...

    android中自定义Emoji表情控件

    在Android开发中,为了增强应用的交互性和用户体验,经常需要集成自定义的Emoji表情控件。这个主题将深入探讨如何在Android中实现这样一个功能。首先,我们从标题"android中自定义Emoji表情控件"来看,它涉及到的是...

    android emoji表情

    本文将深入探讨如何在Android应用中集成和使用emoji表情,以实现一个类似聊天功能的完整解决方案。 首先,我们需要理解emoji表情的来源。Unicode标准包含了数千个emoji字符,这些字符被编码为特定的Unicode码点。...

    Android使用Emoji表情Demo

    在Android平台上,开发人员经常需要处理用户输入的文本,其中包括了常见的Emoji表情。这些表情能够丰富用户的交流体验,尤其在社交应用或者聊天软件中尤为重要。本文将深入探讨如何在Android应用中实现对Emoji表情的...

Global site tag (gtag.js) - Google Analytics