2014-01-27 84 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

相關問題