module Unicode where -- | Like HBC's Char.decodeUTF8, but with more graceful failure. decodeUTF8 :: String -> String decodeUTF8 "" = "" decodeUTF8 (c:cs) | c < '\x80' = c : decodeUTF8 cs decodeUTF8 (c:c':cs) | '\xc0' <= c && c <= '\xdf' && '\x80' <= c' && c' <= '\xbf' = toEnum ((fromEnum c `mod` 0x20) * 0x40 + fromEnum c' `mod` 0x40) : decodeUTF8 cs decodeUTF8 (c:c':c'':cs) | '\xe0' <= c && c <= '\xef' && '\x80' <= c' && c' <= '\xbf' && '\x80' <= c'' && c'' <= '\xbf' = toEnum ((fromEnum c `mod` 0x10 * 0x1000) + (fromEnum c' `mod` 0x40) * 0x40 + fromEnum c'' `mod` 0x40) : decodeUTF8 cs --decodeUTF8 _ = error "UniChar.decodeUTF8: bad data" decodeUTF8 (_:cs) = decodeUTF8 cs encodeUTF8 :: String -> String encodeUTF8 "" = "" encodeUTF8 (c:cs) = if c > '\x0000' && c < '\x0080' then c : encodeUTF8 cs else if c < toEnum 0x0800 then let i = fromEnum c in toEnum (0xc0 + i `div` 0x40) : toEnum (0x80 + i `mod` 0x40) : encodeUTF8 cs else let i = fromEnum c in toEnum (0xe0 + i `div` 0x1000) : toEnum (0x80 + (i `mod` 0x1000) `div` 0x40) : toEnum (0x80 + i `mod` 0x40) : encodeUTF8 cs -- | Compose selected decomposed Unicode characters compose s = case s of [] -> [] 'A':'\778':s -> 'Å':compose s 'A':'\776':s -> 'Ä':compose s 'O':'\776':s -> 'Ö':compose s 'E':'\769':s -> 'É':compose s 'E':'\768':s -> 'È':compose s 'U':'\776':s -> 'Ü':compose s 'a':'\778':s -> 'å':compose s 'a':'\776':s -> 'ä':compose s 'o':'\776':s -> 'ö':compose s 'e':'\769':s -> 'é':compose s 'e':'\768':s -> 'è':compose s 'u':'\776':s -> 'ü':compose s c:s -> c :compose s