2014-03-04 104 views
3

我正在開發Android應用程序,我不希望人們在輸入中使用表情符號。Android - 如何從字符串中過濾表情符號(表情符號)?

如何從字符串中刪除表情符號字符?

+0

正則表達式轉換成字符串是一個選項。或者,如果emojis列表衆所周知,那麼您可以遍歷並刪除輸入中的匹配項的簡單列表就可以正常工作。 –

+1

請參閱http://stackoverflow.com/questions/12013341/removing-characters-of-a-specific-unicode-range-from-a-string – Sujen

+0

您可以使用Character類 http://stackoverflow.com/questions/ 28366172/check-if-letter-is-emoji/41147459#41147459 – user2474486

回答

16

表情符號可在下列範圍內(source)中找到:

  • U + 2190到U + 21FF
  • U + 2600 U + 26FF
  • U + 2700至U + 27BF
  • U + 3000 U + 303F
  • U + 1F300到U + 1F64F
  • U + 1F680到U + 1F6FF

您可以使用此行腳本一次來過濾他們都:

text.replace("/[\u2190-\u21FF]|[\u2600-\u26FF]|[\u2700-\u27BF]|[\u3000-\u303F]|[\u1F300-\u1F64F]|[\u1F680-\u1F6FF]/g", "");

+0

這是一個可能的答案,但不處理所有情況。但是, – user210504

+12

@ user210504它不處理什麼情況?如果你沒有例子,說「這不處理所有情況」是沒有用的。 –

+0

不適用於Xperia Z 4.4 – JiTHiN

0

下面是我用它來去除表情符號。注:API 24和前鋒

public String remove_Emojis_For_Devices_API_24_Onwards(String name) 
    { 
    // we will store all the non emoji characters in this array list 
    ArrayList<Character> nonEmoji = new ArrayList<>(); 

    // this is where we will store the reasembled name 
    String newName = ""; 

    //Character.UnicodeScript.of() was not added till API 24 so this is a 24 up solution 
    if (Build.VERSION.SDK_INT > 23) { 
     /* we are going to cycle through the word checking each character 
     to find its unicode script to compare it against known alphabets*/ 
     for (int i = 0; i < name.length(); i++) { 
      // currently emojis don't have a devoted unicode script so they return UNKNOWN 
      if (!(Character.UnicodeScript.of(name.charAt(i)) + "").equals("UNKNOWN")) { 
       nonEmoji.add(name.charAt(i));//its not an emoji so we add it 
      } 
     } 
     // we then cycle through rebuilding the string 
     for (int i = 0; i < nonEmoji.size(); i++) { 
      newName += nonEmoji.get(i); 
     } 
    } 
    return newName; 
} 

所以如果我們通過一個字符串這僅適用於:

remove_Emojis_For_Devices_API_24_Onwards( 「測試印度語:ढ日本:韓國な:ㅂ」);

返回:測試印度語:ढ日本:韓國な:ㅂ

表情放置或計數不要緊

3

最新的表情符號的數據可以在這裏找到:

http://unicode.org/Public/emoji/

有一個以emoji版本命名的文件夾。 作爲應用程序開發人員的一個好主意是使用最新版本。

當您查看文件夾時,您會看到文本文件。 你應該檢查emoji-data.txt。它包含所有標準的表情符號代碼。

表情符號有許多小符號代碼範圍。 最好的支持將是檢查你的應用程序中的所有這些。

有人問爲什麼有5位數字的代碼,我們只能在\ u後指定4。 那麼這些代碼是由代理對構成的。通常使用2個符號來編碼一個表情符號。

例如,我們有一個字符串。

String s = ...; 

UTF-16表示

byte[] utf16 = s.getBytes("UTF-16BE"); 

遍歷UTF-16

for(int i = 0; i < utf16.length; i += 2) { 

獲取一個字符

char c = (char)((char)(utf16[i] & 0xff) << 8 | (char)(utf16[i + 1] & 0xff)); 

現在檢查代理對。表情符號位於第一個平面上,因此請檢查0xd800..0xd83f範圍內的第一部分對。

if(c >= 0xd800 && c <= 0xd83f) { 
    high = c; 
    continue; 
} 

代理對範圍的第二部分是0xdc00..0xdfff。我們現在可以將一對轉換爲一個5位數的代碼。

else if(c >= 0xdc00 && c <= 0xdfff) { 
    low = c; 
    long unicode = (((long)high - 0xd800) * 0x400) + ((long)low - 0xdc00) + 0x10000; 
} 

所有其他符號都不是對,因此按原樣處理它們。

else { 
    long unicode = c; 
} 

現在使用emoji-data.txt中的數據來檢查它是否是表情符號。 如果是,則跳過它。如果沒有,則將字節複製到輸出字節數組。

最後字節陣列由

String out = new String(outarray, Charset.forName("UTF-16BE")); 
+0

P.S.如果你想刪除一些額外的符號,可以在這裏找到Unicode範圍:http://jrgraphix.net/research/unicode.php – NoAngel

相關問題