2017-09-23 28 views
2

我做了一個Mastodon/Twitter < - > IRC機器人。它工作得很好,但有人抱怨說,當人們在乳齒象上使用emojis時(這在某些用戶名中似乎發生了很多..)它打破了他的終端。從Haskell中的一個字符串中刪除所有表情符

我想知道是否有一種方法將它們發送到IRC之前卸下這些從字節串(或至少提供一個選項,這樣做),谷歌上搜索了一下,我發現這一點:removing emojis from a string in Python

貌似\ U0001F600- \ U0001F64F應該是表情符號範圍,如果我理解正確的話,但我從來沒有使用過正則表達式。任何簡單的方法將其轉化爲Haskell?我試着讀了一下正則表達式,但是當我嘗試時,我只得到「在字符'U'處的字符串/字符字面值詞法錯誤',我假定語法必須是python的東西。

感謝

回答

2

不是一個表情符或Unicode專家,但這似乎工作:

isEmoji :: Char -> Bool 
isEmoji c = let uc = fromEnum c 
      in uc >= 0x1F600 && uc <= 0x1F64F 

str = "wew" 

丹尼爾·瓦格納指出,這可製成甚至更好:

isEmoji :: Char -> Bool 
isEmoji c = c >= '\x1F600' && c <= '\x1F64F' 

演示in ghci:

λ> str 
"\128513wew\128513" 
λ> filter isEmoji str 
"\128513\128513" 
λ> filter (not . isEmoji) str 
"wew" 

說明:fromEnum函數將字符轉換爲由Unicode定義的對應值Int。我只是檢查函數中的表情符號的Unicode範圍,以確定它是否實際上是表情符號。

+0

看起來像它的偉大工程!非常感謝,它實際上比我預期的要簡單得多。一個簡單的> = <= .. – Ulrar

+0

不需要'fromEnum',只需'isEmoji c = c> ='\ x1f600'&& c <='\ x1f64f''。 –

+0

範圍是0x1f000..0x1f9ff:http://unicode.org/emoji/charts/full-emoji-list.html – Artem

3

Unicode字符由單個反斜槓表示,接着任選的x爲十六進制,o爲八進制,沒有用於表示字符[0]的十進制數:

putStrLn "\x1f600" -- 

這裏,\x爲前綴Unicode中第一個表情符號的十六進制表示。

現在可以使用正則表達式刪除表情符號,或者你可以簡單地做:

emojis = concat [['\x1f600'..'\x1F64F'], 
       ['\x1f300'..'\x1f5ff'], 
       ['\x1f680'..'\x1f6ff'], 
       ['\x1f1e0'..'\x1f1ff']] 
someString = "hello " 
removeEmojis = filter (`notElem` emojis) 

putStrLn . removeEmojis $ someString -- "hello " 

[0] Haskell Language 2010: Lexical Structure#Character and String Literals

+0

謝謝,這確實有用!我與其他答案一起去了,因爲我認爲它更輕,但都達到了我所期望的 – Ulrar

相關問題