android中的系统表情解决方案

本文介绍了Android系统中表情符号与UNICODE编码的关系,以及如何解决系统表情在不同设备上的显示问题。通过解析字符串,区分字符和表情,并将表情转换为Android控件可识别的字节数组,从而实现表情的正确保存和显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统表情描述:

     android中手机系统表情符号与唯一的UNICODE编码对应,而UNICODE编码其实与该系统表情的表情描述是一一对应的,不同手机系统主要根据表情的"表情描述"进行对应表情图片的--具体参考点击打开链接

   

系统表情的解决方案:

    总体的思路:

          (1)从android中的控件中进行获取原生的字符串:对字符串进行遍历:区别"字符"和"表情"

                 成为:“×abab中海×&表情&×”-->其中对表情进行获取“字符”的字节码数组生成[-10,-30],最终为
                   “×abab中海×&表情&×”-->“×abab中海×&-10,-30&×”然后进行整体的字节传递

                   给服务端保存。


          (2)从服务端传递的字节数组整合成字符串进行解析:

                    主要将表情解析成android控件认识的字节数组-->生成字符串-->放入到android控件中!


 第一步:进行分割字符串和表情

/*
	 * 注意:一个android系统表情从控件中获取字符串后:为两个字符-->"  "
	 *      主要是通过将对应的字符转换成"utf-8"的字节数组,继而将字节数组
	 *      转换为数组形式:Arrays.toString  [-16, -97, -104, -95]
	 *    
	 *      由于'['比较常见的字符————>所以要转换为'Γ'--->Γ-16, -97, -104, -95Γ
     *
	 *      而汉字与表情之间用'⅞'分开,方便后台进行解析显示,同时android端获取服务端的数据
	 *      也方便android端进行解析!
	 */
	String string;
	public String filterEmoji(String source) {
		System.out.println("ctatting running source = "+source);
		if (!containsEmoji(source)) {
			return source;// 如果不包含,直接返回
		}
		StringBuilder buf = null;
		int len = source.length();
		for (int i = 0; i < len; i++) {
			char codePoint = source.charAt(i);
			if (buf == null) {
				buf = new StringBuilder(source.length());
			}
			if (!isEmojiCharacter(codePoint)) {
				string = String.valueOf(codePoint);
			} else {
				try {
					StringBuilder builder = new StringBuilder(2);
					byte[] str = builder.append(String.valueOf(codePoint))
							.append(String.valueOf(source.charAt(i+1)))
							.toString().getBytes("UTF-8");
					String strin = Arrays.toString(str);
					String newString = strin.substring(1, strin.length() - 1);
					string = "Γ"+newString+"Γ";
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				i++;
			}
			buf.append(string+"⅞");
		}
		if (buf == null) {
			return "";
		} else {
			if (buf.length() == len) {// 这里的意义在于尽可能少的toString,因为会重新生成字符串
				buf = null;
				return source;
			} else {
				String bufStr = buf.toString();
				String newBufStr= bufStr.substring(0, bufStr.length() - 1);
				return newBufStr;
			}
		}
	}

判断字符串是否包含"表情符号":

// 判别是否包含Emoji表情
	private boolean containsEmoji(String str) {
		int len = str.length();
		for (int i = 0; i < len; i++) {
			if (isEmojiCharacter(str.charAt(i))) {
				return true;
			}
		}
		return false;
	}
    
	/*
	 * 进行判断是否是表情字符串
	 *     
	 */
	private boolean isEmojiCharacter(char codePoint) {
		return !((codePoint == 0x0) ||
				(codePoint == 0x9) ||
				(codePoint == 0xA) ||
				(codePoint == 0xD) ||
				((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
				((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
				((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));
	}

第二步:获取服务端的数据,解析出对应的表情,放入到android控件中:

//得到服务器的数据之后进行解析,显示在UI上
	/*
	 * 进行反解析服务端传递的字符串:
	 *    用"⅞"进行分隔服务端传递过来的字符串arrays[]
	 *    继而遍历arrays[],当arrays[i]符合"Γ----Γ"时,
	 *    进行取出----,分隔", "得到strArrays[],遍历其,
	 *    将strArrays[i]转换为字节,放入字节数组,最终获取
	 *    到字符串!
	 */
	String newsString;
	public void setString(TextView textView,String string) {
		StringBuilder stringBuilder = new StringBuilder();
		String arrays[] = string.split("⅞");
		for (int j = 0; j < arrays.length; j++) {
			String  ss = arrays[j];
			char char_ss = ss.charAt(0);
			if (String.valueOf(char_ss).equals("Γ")){
				String new_SS = ss.substring(1, ss.length() - 1);
				String strArrays[] = new_SS.split(", ");
				byte[] chars = new byte[strArrays.length];
				for (int i = 0; i < strArrays.length; ++i) {
					System.out.println("strArrays[i]:" + strArrays[i]);
					chars[i] = Byte.decode(strArrays[i]);
				}
				newsString = new String(chars);
			}else{
				newsString =ss;
			}
			stringBuilder.append(newsString);
			textView.setText(stringBuilder.toString());
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值