首页 > 编程语言 >一个Java基于codePoint的emoji判断方法

一个Java基于codePoint的emoji判断方法

时间:2024-05-16 23:53:54浏览次数:18  
标签:codePoint ch return int Character source Java emoji

该方法参考自一篇博客java判断是否是emoji字符(史上最全)_Mr.QingBin的博客-CSDN博客_java 判断emoji

经过简单封装如下:

public class EmojiFilter {
  private EmojiFilter() {
  }

  /**
   * 过滤emoji 或者 其他非文字类型的字符
   * 如果只需要判断是否含有emoji,使用hasEmoji方法更好(不需要遍历所有字符)
   *
   * @param source
   * @return
   */
  public static String filterEmoji(String source) {
    if (!StringUtils.hasText(source)) {
      return source;
    }
    StringBuilder sb = new StringBuilder();
    int len = source.length();
    for (int i = 0; i < len; i++) {
      char ch = source.charAt(i);
      if (!Character.isSurrogate(ch)) {
        //单个codepoint
        if (!isEmojiCharacter(Character.codePointAt(source, i))) {
          sb.append(ch);
        }
      } else {
        //两个codepoint
        char ch2 = source.charAt(i + 1);//低位codepoint
        if (!isEmojiCharacter(Character.codePointAt(source, i)) && Character.isSurrogatePair(ch, ch2)) {
          sb.append(ch);
          sb.append(ch2);
        }
      }
    }
    return sb.toString();
  }

  public static boolean hasEmoji(String source) {
    if (!StringUtils.hasText(source)) {
      return false;
    }
    char[] chars = source.toCharArray();
    int length = chars.length;
    for (int i = 0; i < length; i++) {
      if (isEmojiCharacter(Character.codePointAt(chars, i))) {
        return true;
      }
    }
    return false;
  }

  /*参考:
   * java判断是否是emoji字符(史上最全)_Mr.QingBin的博客-CSDN博客_java 判断emoji
      https://blog.csdn.net/congqingbin/article/details/97144558
      */
  private static boolean isEmojiCharacter(int codePoint) {
    return
            (0x0300 <= codePoint && codePoint <= 0x03FF) ||
            (0x0600 <= codePoint && codePoint <= 0x06FF) ||
            (0x0C00 <= codePoint && codePoint <= 0x0C7F) ||
            (0x1DC0 <= codePoint && codePoint <= 0x1DFF) ||
            (0x1E00 <= codePoint && codePoint <= 0x1EFF) ||
            (0x2000 <= codePoint && codePoint <= 0x209F) ||
            (0x20D0 <= codePoint && codePoint <= 0x214F) ||
            (0x2190 <= codePoint && codePoint <= 0x23FF) ||
            (0x2460 <= codePoint && codePoint <= 0x25FF) ||
            (0x2600 <= codePoint && codePoint <= 0x27EF) ||
            (0x2900 <= codePoint && codePoint <= 0x29FF) ||
            (0x2B00 <= codePoint && codePoint <= 0x2BFF) ||
            (0x2C60 <= codePoint && codePoint <= 0x2C7F) ||
            (0x2E00 <= codePoint && codePoint <= 0x2E7F) ||
            (0xA490 <= codePoint && codePoint <= 0xA4CF) ||
            (0xE000 <= codePoint && codePoint <= 0xF8FF) ||
            (0xFE00 <= codePoint && codePoint <= 0xFE0F) ||
            (0xFE30 <= codePoint && codePoint <= 0xFE4F) ||
            (0x1F000 <= codePoint && codePoint <= 0x1F02F) ||
            (0x1F0A0 <= codePoint && codePoint <= 0x1F0FF) ||
            (0x1F100 <= codePoint && codePoint <= 0x1F64F) ||
            (0x1F680 <= codePoint && codePoint <= 0x1F6FF) ||
            (0x1F910 <= codePoint && codePoint <= 0x1F96B) ||
            (0x1F980 <= codePoint && codePoint <= 0x1F9E0);
  }

}

 

标签:codePoint,ch,return,int,Character,source,Java,emoji
From: https://www.cnblogs.com/JackieJK/p/18197008

相关文章

  • 一个Java基于阻塞的定时消费内存队列
     @Getter@AllArgsConstructorpublicenumInsertQueueEnum{A(30000,10,TimeUnit.SECONDS,2,1000),;privatefinalintcapacity;//队列长度privatefinalinttime;//最长阻塞时间privatefinalTimeUnittimeUnit;//最长阻塞时间单位privatefi......
  • Java 网络编程(socket)
    概念:1.什么是网络编程?  计算机跟计算机之间通过网络进行数据传输。2.通信的软件架构C/S与B/S的区别?  C/S:客户端/服务端模式(需要开发客户端)  B/S:浏览器/服务端模式(不需要开发客户端)  网络编程三要素:1.IP     设备在网络中的地址,是唯一的标识2.......
  • hdu1176免费馅饼java
    一个数塔问题,以时间为纵坐标、位置为横坐标创建一个二维数组,然后从下往上相加。状态转移方程:9>=j>=1时dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j+1]),dp[i+1][j-1])  j=0时 dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]) j=10时dp[i][j]+=......
  • Java-并发-ReentrantLock
    0.是什么ReentrantLock是java.util.concurrent.locks包中的一个类,提供了比synchronized关键字更灵活和强大的锁机制。ReentrantLock实现了Lock接口,它允许显式地加锁和解锁,并提供了一些高级功能,如中断锁请求、超时锁请求、公平锁和非公平锁选择等。1.为什么在Java诞生......
  • Java-线程-wait()、notify()和notifyAll()
    0.是什么(What)wait(),notify(),和notifyAll()方法都是Object类的一部分,用于实现线程间的协作。1.为什么(Why)线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们希望的是它们能够顺序的执行。所以引入了这几个方法,使得我们能保证一定的顺序。1.1Objec类......
  • java复习
    Java复习好久没写博客了,主要是,忙着去干其他事去了。最近Java要考试了,打算梳理一下Java的知识点,主要是一些基础的语法,和Java的核心的常用的类库。ObjectObject类是Java中所有类的父类,因此有必要对该类中的方法进行了解,并记忆。Object类在java.lang中,常用方法如下:equals()......
  • java生成数字运算验证码
    第一步,引入依赖<!--验证码依赖--><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency> <!--算数验证码使用--><dependency><groupId>......
  • Java面试题:Spring中的循环依赖,给程序员带来的心理阴影
    循环依赖通常发生在两个或多个SpringBean之间,它们通过构造器、字段(使用@Autowired)或setter方法相互依赖,从而形成一个闭环。下面是一个使用字段注入(即使用@Autowired)导致的循环依赖的示例: 示例代码: 假设我们有两个类,ClassA和ClassB,它们相互依赖:publicclassClassA{......
  • JavaScript中执行上下文和执行栈是什么?
    一、执行上下文简单的来说,执行上下文是一种对Javascript代码执行环境的抽象概念,也就是说只要有Javascript代码运行,那么它就一定是运行在执行上下文中执行上下文的类型分为三种:全局执行上下文:只有一个,浏览器中的全局对象就是 window对象,this 指向这个全局对象函数执行上下......
  • Java IO
    JavaIO的理解在Java编程中,IO(Input/Output)是处理输入和输出操作的基础。JavaIO库提供了一套完整的API,用于从各种源(如文件、网络、内存等)读取数据,并将数据写入到各种目标中。理解JavaIO库的设计思路、特性和实际用途对于开发健壮且高效的Java应用程序至关重要。JavaIO的设计思......