2017-09-23 13 views
2

私はマストドン/ Twitterを作りました< - > IRC botそれはうまくいっていますが、誰かがmastodon(これはいくつかのユーザー名で多く発生すると思われる)でemojisを使用すると、端末が壊れてしまうという不満があります。ハスケルの文字列からすべての絵文字を削除します

IRCに送信する前にバイト文字列からそれらを削除する方法があれば、私はこの発見ビットグーグル、(または少なくともそうするオプションを提供)思っていた:removing emojis from a string in Python

がどのように見えるの\ U0001F600- \ U0001F64Fは正しく理解できれば絵文字の範囲でなければなりませんが、正規表現では一度も大きかったことはありません。それをハスケルに翻訳する簡単な方法はありますか?私は正規表現で少し読んでみましたが、試してみると "文字列の文字エラー"(文字 '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' 

デモghci:

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

説明:fromEnum関数は、Unicodeによって定義された対応するInt値に文字を変換します。私は、実際に絵文字であるかどうかを判断するために、関数内のユニコード範囲の絵文字をチェックします。ここ

putStrLn "\x1f600" -- 

\xでのプレフィックスではない:

+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文字は8進数の16進のための任意xo続く文字[0]を10進数のいずれも、単一のバックスラッシュによって表されていますUnicodeの最初の絵文字の16進表現です。

これで、正規表現を使って絵文字を削除することもできますし、単に行うことができます:

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

関連する問題