判断是否是 emoji表情

来源:互联网 发布:淘宝贷款可以逾期多久 编辑:程序博客网 时间:2024/05/30 22:58


  1. public class EmojiFilter {

  2.     /**
  3.      * 检测是否有emoji字符
  4.      * @param source
  5.      * [url=home.php?mod=space&uid=7300]@return[/url] 一旦含有就抛出
  6.      */
  7.     public static boolean containsEmoji(String source) {
  8.         if (StringUtils.isBlank(source)) {
  9.             return false;
  10.         }

  11.         int len = source.length();

  12.         for (int i = 0; i < len; i++) {
  13.             char codePoint = source.charAt(i);

  14.             if (isEmojiCharacter(codePoint)) {
  15.                 //do nothing,判断到了这里表明,确认有表情字符
  16.                 return true;
  17.             }
  18.         }

  19.         return false;
  20.     }

  21.     private static boolean isEmojiCharacter(char codePoint) {
  22.         return !((codePoint == 0x0) ||
  23.                 (codePoint == 0x9) ||
  24.                 (codePoint == 0xA) ||
  25.                 (codePoint == 0xD) ||
  26.                 ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
  27.                 ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
  28.                 ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));
  29.     }

  30.     /**
  31.      * 过滤emoji 或者 其他非文字类型的字符
  32.      * @param source
  33.      * @return
  34.      */
  35.     public static String filterEmoji(String source) {

  36.         if (!containsEmoji(source)) {
  37.             return source;//如果不包含,直接返回
  38.         }
  39.         //到这里铁定包含
  40.         StringBuilder buf = null;

  41.         int len = source.length();

  42.         for (int i = 0; i < len; i++) {
  43.             char codePoint = source.charAt(i);

  44.             if (!isEmojiCharacter(codePoint)) {
  45.                 if (buf == null) {
  46.                     buf = new StringBuilder(source.length());
  47.                 }

  48.                 buf.append(codePoint);
  49.             } else {
  50.             }
  51.         }

  52.         if (buf == null) {
  53.             return source;//如果没有找到 emoji表情,则返回源字符串
  54.         } else {
  55.             if (buf.length() == len) {//这里的意义在于尽可能少的toString,因为会重新生成字符串
  56.                 buf = null;
  57.                 return source;
  58.             } else {
  59.                 return buf.toString();
  60.             }
  61.         }

  62.     }
  63. }
复制代码
大家请仔细阅读下该类的代码。你要是用该类,调用filterEmoji方法,肯定可以把表情过滤掉的,但是 大家请仔细阅读下containsEmoji这个方法,这个方法返回的值 永远是true,也就是说filterEmoji方法里面的!containsEmoji(source)这个判断永远是false,然后永远会继续往下执行。然后大家再分析一下filterEmoji这个方法,其实里面已经包含了用isEmojiCharacter来循环判断来过滤表情的方法。所以 我们只需要把filterEmoji这个方法中的if (isEmojiCharacter(codePoint))这部分代码去掉,直接用这个方法 就可以实现效果了。请使用以下类就可以了。下面连接附上我的小demo。
  1. public class EmojiFilter {
  2. /**
  3. * 是否包含表情

  4. * @author 杨振威 2015-3-26 下午2:41:08
  5. * @param codePoint
  6. * @return 如果不包含 返回false,包含 则返回true
  7. */

  8. private static boolean isEmojiCharacter(char codePoint) {
  9. return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
  10. || (codePoint == 0xD)
  11. || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
  12. || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));
  13. }

  14. /**
  15. * 过滤emoji 或者 其他非文字类型的字符

  16. * @author 杨振威 2015-3-26 下午2:42:11
  17. * @param source
  18. * @return
  19. */
  20. public static String filterEmoji(String source) {

  21. StringBuilder buf = null;

  22. int len = source.length();

  23. for (int i = 0; i < len; i++) {
  24. char codePoint = source.charAt(i);

  25. if (!isEmojiCharacter(codePoint)) {// 如果不包含 则将字符append
  26. if (buf == null) {
  27. buf = new StringBuilder(source.length());
  28. }

  29. buf.append(codePoint);
  30. } else {
  31. }
  32. }

  33. if (buf == null) {
  34. return source;// 如果没有找到 emoji表情,则返回源字符串
  35. } else {
  36. if (buf.length() == len) {// 这里的意义在于尽可能少的toString,因为会重新生成字符串
  37. buf = null;
  38. return source;
  39. } else {
  40. return buf.toString();
  41. }
  42. }

  43. }
  44. }
0 0