对于 Char 数据类型,如何指定在 toLower 和 toUpper 函数中使用土耳其语的 "i" 而不是英语的 "i"?
对于 Char 数据类型,如何指定在 toLower 和 toUpper 函数中使用土耳其语的 "i" 而不是英语的 "i"?
text和text-icu包
截至2011年,最好使用text包以及Text ICU包中的toLower
函数,该函数支持由语言环境参数化的Char
操作。
来自这个示例:
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
格式中。
Data.Char
库不依赖于本地设置。它适用于所有 Unicode 字符,但可能并不像您期望的那样工作。在相应的 Unicode 图表中,您可以看到“点状”/“无点”的 i 的映射。
toUpper 'i'
=> 'I'
toUpper 'ı'
=> 'I'
toLower 'I'
=> 'i'
toLower 'İ'
=> 'i'
Char
对应于一个 Unicode 字符,并没有明确定义toLower
和toUpper
的语义。toLower 'I'
应返回无点的 i
。 - Alexandre C.一个简单的编程问题:
import qualified Data.Char as Char
toLower 'I' = 'ı'
toLower x = Char.toLower x
那么
toLower <$> "I AM LOWERCASE" == "ı am lowercase"
Char.toLower
函数的库都没有为国际化做好准备。 - grddev
toUpper
函数必须要么是不正确的,要么返回一个字符串。两者都不是很吸引人。 - C. A. McCann