Haskell, Char, Unicode и Turkish - PullRequest
       22

Haskell, Char, Unicode и Turkish

26 голосов
/ 05 августа 2010

Для типа данных Char как мне указать, что я хочу использовать турецкий i вместо английского i для функций toLower и toUpper?

Ответы [ 5 ]

16 голосов
/ 22 апреля 2011

текст и пакет text-icu

Начиная с 2011 года, лучше всего использовать пакет text и функцию toLower текстовый пакет ICU , который поддерживает 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.

15 голосов
/ 05 августа 2010

Библиотека Data.Char в Haskell не зависит от локали. Это работает для всех символов Юникода, но, возможно, не так, как вы ожидаете. В соответствующей диаграмме Unicode вы можете видеть сопоставления для «пунктирных» / «точечных» я.

  • toUpper 'i' => 'I'
  • toUpper 'ı' => 'I'
  • toLower 'I' => 'i'
  • toLower 'İ' => 'i'

Таким образом, ясно, что ни одно из двух преобразований не является обратимым. Если вам нужна обратимая обработка турецких символов, похоже, вам нужно либо использовать C-библиотеку, либо свернуть свою собственную.

ОБНОВЛЕНИЕ: В отчете Haskell 98 об этом достаточно ясно сказано, тогда как в отчете Haskell 2010 говорится только, что Char соответствует символу Unicode, и не так четко определяет семантику toLower и toUpper.

7 голосов
/ 05 августа 2010

Простое дело программирования:

import qualified Data.Char as Char

toLower 'I' = 'ı'
toLower x   = Char.toLower x

Тогда

toLower <$> "I AM LOWERCASE" == "ı am lowercase"  
1 голос
/ 15 октября 2010

Вы можете проверить этот пост , используя текстовую библиотеку.

0 голосов
/ 05 августа 2010

может быть, попробовать установить свой язык?не уверен

...