Dav*_*ric 8 string locale haskell localization
是否可以在Haskell(GHC)中使用国家字符对字符串进行正确排序?换句话说,按当前区域设置正确整理Chars?
我确实只找到了ICU模块,但它需要安装额外的库,因为它不是linux发行版的标准部分.我想要基于POSIX的C(glibc like)库的解决方案,因此处理额外的依赖关系不会有任何麻烦.
Don*_*art 14
推荐方式:text-icu
如您所见,以区域设置敏感的方式强健处理字符串的推荐方法是通过text和text-icu.该文本库标准库集,提供哈斯克尔平台.
一个例子,排序土耳其字符串:
{-# LANGUAGE OverloadedStrings #-}
import Data.Text.IO as T
import Data.Text.ICU as T
import Data.List (sortBy)
main = do
let trLocale = T.Locale "tr-TR"
str = "ÇI??Ö?Ü"
strs = take 10 (cycle $ T.toLower trLocale str : str : [])
mapM_ T.putStrLn (sortBy (T.compare [T.FoldCaseExcludeSpecialI]) strs)
Run Code Online (Sandbox Code Playgroud)
在正确地降低土耳其语字符串的大小后,似乎可以通过基于语言环境的词典排序正确排序:
*Main> main
ÇI??Ö?Ü
ÇI??Ö?Ü
ÇI??Ö?Ü
ÇI??Ö?Ü
ÇI??Ö?Ü
ç?i?ö?ü
ç?i?ö?ü
ç?i?ö?ü
ç?i?ö?ü
ç?i?ö?ü
Run Code Online (Sandbox Code Playgroud)
不使用text-icu包
您已在问题中询问避免使用其他库的解决方案,而不是Posix提供的解决方案.虽然text-icu可以从Hackage(cabal install text-icu)轻松安装,但它确实依赖于ICU C库,而这在任何地方都不可用.此外,没有Posix替代方案具有强大或全面性.最后,text-icu是唯一正确执行多字符字符转换的包.
但是,鉴于此,Haskell中内置的Char和String类型提供Data.Char,其值表示Unicode,并且使用Open Group定义的函数,以区域设置不敏感的方式提供将进行Unicode大小写转换的wchar_t函数.此外,我们可以以(文本)区域设置敏感的方式对句柄执行IO.
import System.IO
import Data.Char
import Data.List (sort)
main = do
t <- mkTextEncoding "UTF-8"
hSetEncoding stdout t
let str = "ÇI??Ö?Ü"
strs = take 10 (cycle $ map toLower str : str : [])
mapM_ putStrLn (sort strs)
Run Code Online (Sandbox Code Playgroud)
实际上,GHC默认会将您的文本区域设置用于IO(例如UTF8).对于许多问题,这可能会给出正确的答案.您必须意识到在许多情况下它也会出错,因为如果没有批量处理文本,以及丰富的转换和比较支持,它是不可能正确的.
*Main> main
ÇI??Ö?Ü
ÇI??Ö?Ü
ÇI??Ö?Ü
ÇI??Ö?Ü
ÇI??Ö?Ü
çii?ö?ü
çii?ö?ü
çii?ö?ü
çii?ö?ü
çii?ö?ü
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1009 次 |
| 最近记录: |