2014-01-27 45 views
3

如标题所示。我想知道给定的Java String是否包含一个表情符号。检测字符串中的字符是否是表情符号(使用Android)

因为这需要API级别19

I found this code for iOS,但它不是真正适用,因为它看起来像Java和Objective-C处理以不同的方式代理对我不能使用Character.UnicodeBlock.of(char) == Character.UnicodeBlock.EMOTICONS

的单证我看遍了告诉我:

A char value, therefore, represents Basic Multilingual Plane (BMP) code points, including the surrogate code points, or code units of the UTF-16 encoding 

我不太清楚这意味着什么。这是否仅仅意味着他们还包括BMP点作为他们的第一个数字?

According to Wikipedia表情集位于0x1f600和0x1f64f之间,但我不知道如何检查char是否在该范围内。

我曾希望像这样的工作,但它并没有

if (0x1f600 <= a && a <= 0x1f64f) 
{ 
    Print.d("Unicode", "groovy!"); 
} 

那我怎么去呢?

回答

1

我实际上能够使用链接的iOS代码来创建以下功能。我没有意识到包含例如单个表情符号的字符串长度为2.因此,您可以检查一个字符是否实际上是替代物。

我不完全确定如何处理来自iOS代码的else if (substring.length > 1),但我认为Character.isHighSurrogate(myChar)在该实例中执行相同的工作。

private boolean containsIllegalCharacters(String displayName) 
{ 
    final int nameLength = displayName.length(); 

    for (int i = 0; i < nameLength; i++) 
    { 
     final char hs = displayName.charAt(i); 

     if (0xd800 <= hs && hs <= 0xdbff) 
     { 
      final char ls = displayName.charAt(i + 1); 
      final int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000; 

      if (0x1d000 <= uc && uc <= 0x1f77f) 
      { 
       return true; 
      } 
     } 
     else if (Character.isHighSurrogate(hs)) 
     { 
      final char ls = displayName.charAt(i + 1); 

      if (ls == 0x20e3) 
      { 
       return true; 
      } 
     } 
     else 
     { 
      // non surrogate 
      if (0x2100 <= hs && hs <= 0x27ff) 
      { 
       return true; 
      } 
      else if (0x2B05 <= hs && hs <= 0x2b07) 
      { 
       return true; 
      } 
      else if (0x2934 <= hs && hs <= 0x2935) 
      { 
       return true; 
      } 
      else if (0x3297 <= hs && hs <= 0x3299) 
      { 
       return true; 
      } 
      else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 
0

尝试......

if (Integer.parseInt("1f600", 16) <= (int)'☺' && (int)'☺' <= Integer.parseInt("1f64f", 16)) { 
    Print.d("Unicode", "groovy!"); 
} 

这可能会实现,因为十六进制值和字符值都被转换为整数。

+0

对不起,说这不起作用,但无论如何感谢。 – Bjorninn

相关问题