如何在Haskell中使用表情符号?

时间:2019-10-25 01:14:46

标签: haskell encoding emoji

我正在做以下事情:

a)实现一个函数enc :: String->字符串,该字符串将所有小写ASCII字母转换为表情符号,并将所有大写ASCII字母转换为表示动物的符号。

b)实现函数dec :: String->实现逆函数的字符串,将代表动物的表情符号和符号转换为ASCII字母。

我已经开始执行以下操作,根据输入内容检查是解码还是编码:

-- Peek into the content to decide whether we encode or decode.
convert :: String -> String
convert xs
 | null $ filter (\c -> isLetter c && isAscii c) xs = dec xs
 | otherwise = enc xs   

main = do
    contents <- getContents
    putStr $ convert contents

问题在于如何在haskell工作流程中使用表情符号。即使我使用parse input error

,在haskell内部使用表情符号也总是给我Data.Char

1 个答案:

答案 0 :(得分:1)

问题写得不好,没有解释问题所在。

您可以从这样的内容开始

import Data.Char

toAnimal :: Char -> Char
toAnimal c = chr . (+127970) $ ord c

toSmileyEmoji :: Char-> Char
toSmileyEmoji c = chr . (+128415) $ ord c

encode :: String -> String
encode xs = map (\c -> if isUpper c then toAnimal c else toSmileyEmoji c) xs

fromAnimal :: Char -> Char
fromAnimal c = chr $ (ord c) - 127970

fromSmileyEmoji :: Char-> Char
fromSmileyEmoji c = chr $ (ord c) - 128415

isAnimal :: Char -> Bool
isAnimal c = if ((ord c >= ord '?') && (ord c <= ord '?')) then True else False

decode :: String -> String
decode xs = map (\c -> if isAnimal c then fromAnimal c else fromSmileyEmoji c) xs

main = do
    contents1 <- getLine
    contents2 <- getLine
    putStr $ (encode contents1) ++ "\n" ++ (decode contents2)

输入

ABCDEFGHIJKLMNOPQRSTUVWXYZ
??????????????????????????

输出

??????????????????????????
ABCDEFGHIJKLMNOPQRSTUVWXYZ

https://ideone.com/iePD1a

笑脸表情符号从128512开始,动物表情符号从128045开始(嗯,不是真正的实际“开始”,但至少它可以适合字母)。 ASCII小写字母从97和65(大写)开始。您只需添加它,它便会变成您想要的表情符号

例如

65 [A] + (128045 [?] - 65 [A]) = 128045 [?]
and so on...