diff --git a/bellolibrary/src/main/java/me/bello/bellolibrary/Util/EmojiUtils.java b/bellolibrary/src/main/java/me/bello/bellolibrary/Util/EmojiUtils.java new file mode 100644 index 0000000..42fd1ab --- /dev/null +++ b/bellolibrary/src/main/java/me/bello/bellolibrary/Util/EmojiUtils.java @@ -0,0 +1,137 @@ +package me.bello.bellolibrary.Util; + + +/** + * 处理Emoji表情 + *

+ * Created by bell on 17/8/26. + */ + +public class EmojiUtils { + + /** + * 将转码后的unicode转成字符显示 + * + * @param content + * @return + */ + public static String UnescapeString(String content) { + + char aChar; + int len = content.length(); + StringBuffer outBuffer = new StringBuffer(len); + for (int x = 0; x < len; ) { + aChar = content.charAt(x++); + if (aChar == '\\') { + aChar = content.charAt(x++); + if (aChar == 'u') { + // Read the xxxx + int value = 0; + for (int i = 0; i < 4; i++) { + + if (x == len) { //为了解决三位的表情符号编码 会发生数组越界异常 + outBuffer.append((char) value); + return outBuffer.toString(); + } + aChar = content.charAt(x++); + switch (aChar) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + value = (value << 4) + aChar - '0'; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + value = (value << 4) + 10 + aChar - 'a'; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + value = (value << 4) + 10 + aChar - 'A'; + break; + default: + outBuffer.append((char) value); //为了解决编码是三位的情况,直接输出,减1,最后一位是字符 不是表情编码 + x--; + } + } + outBuffer.append((char) value); + } else { + if (aChar == 't') + aChar = '\t'; + else if (aChar == 'r') + aChar = '\r'; + else if (aChar == 'n') + aChar = '\n'; + else if (aChar == 'f') + aChar = '\f'; + outBuffer.append(aChar); + } + } else + outBuffer.append(aChar); + } + return outBuffer.toString(); + } + + + /** + * 对输入内容中的emoji表情进行unicode编码 + * + * @param st + * @return + */ + public static String escapeString(String st) { + StringBuilder builder = new StringBuilder(); + try { + for (int i = 0; i < st.length(); i++) { + char c = st.charAt(i); + if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c) && !Character.isWhitespace(c) && !isChinese(c)) { + String unicode = String.valueOf(c); + int code = (int) c; + if (!(code >= 0 && code <= 255)) { + unicode = "\\u" + Integer.toHexString(c); + } + builder.append(unicode); + } else { + builder.append(c); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return builder.toString(); + } + + /** + * 根据Unicode编码判断中文汉字和中文标点符号 + * + * @param c + * @return + */ + public static boolean isChinese(char c) { + Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); + if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS + || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS + || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A + || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B + || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION + || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS + || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) { + return true; + } + return false; + } +}