系统表情描述:
android中手机系统表情符号与唯一的UNICODE编码对应,而UNICODE编码其实与该系统表情的表情描述是一一对应的,不同手机系统主要根据表情的"表情描述"进行对应表情图片的--具体参考点击打开链接
系统表情的解决方案:
总体的思路:
(1)从android中的控件中进行获取原生的字符串:对字符串进行遍历:区别"字符"和"表情"
成为:“×abab中海×&表情&×”-->其中对表情进行获取“字符”的字节码数组生成[-10,-30],最终为“×abab中海×&表情&×”-->“×abab中海×&-10,-30&×”然后进行整体的字节传递
给服务端保存。
主要将表情解析成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());
}
}