对于Char数据类型,如何指定我想将土耳其语i而不是英语i用于toLower和toUpper函数?
答案 0 :(得分:16)
text和text-icu包
截至2011年,您最好的选择是使用text软件包以及the Text ICU package的toLower
函数,该函数支持由区域设置参数化的Char
操作,< / p>
来自this example:
import Data.Text (pack, unpack)
import Data.Text.ICU (LocaleName(Locale), toLower)
main = do
let trLocale = Locale "tr-TR"
upStr = "ÇIİĞÖŞÜ"
lowStr = unpack $ toLower trLocale $ pack upStr
putStrLn $ "toLower " ++ upStr ++ " gives " ++ lowStr
运行此:
> toLower ÇIİĞÖŞÜ gives çıiğöşü
虽然此示例在String
之间进行转换,但您也可以将数据保留为text
格式。
答案 1 :(得分:15)
Haskell中的Data.Char
库不依赖于语言环境。它适用于所有Unicode字符,但可能不是您期望的方式。在the corresponding Unicode chart中,您可以看到“点缀”/“无点”的映射。
toUpper 'i'
=&gt; 'I'
toUpper 'ı'
=&gt; 'I'
toLower 'I'
=&gt; 'i'
toLower 'İ'
=&gt; 'i'
因此,很明显两个变换都不是可逆的。如果你想要可逆地处理土耳其语字符,你似乎必须使用C库或自己动手。
更新 Haskell 98 report使这一点非常明确,而Haskell 2010 report只表示Char
对应于Unicode字符,并没有明确定义toLower
和toUpper
的语义。
答案 2 :(得分:7)
一个简单的编程问题:
import qualified Data.Char as Char
toLower 'I' = 'ı'
toLower x = Char.toLower x
然后
toLower <$> "I AM LOWERCASE" == "ı am lowercase"
答案 3 :(得分:1)
您可以使用文本库检查this post。
答案 4 :(得分:0)
也许尝试设置您的区域设置?不确定