Haskell,Char,Unicode和土耳其语

时间:2010-08-05 07:26:07

标签: text unicode haskell localization internationalization

对于Char数据类型,如何指定我想将土耳其语i而不是英语i用于toLower和toUpper函数?

5 个答案:

答案 0 :(得分:16)

text和text-icu包

截至2011年,您最好的选择是使用text软件包以及the Text ICU packagetoLower函数,该函数支持由区域设置参数化的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字符,并没有明确定义toLowertoUpper的语义。

答案 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)

也许尝试设置您的区域设置?不确定