Подтвердить что ты не робот

Haskell, Char, Unicode и Turkish

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

4b9b3361

Ответ 1

текст и пакет 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.

Ответ 2

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

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

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

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

Ответ 3

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

import qualified Data.Char as Char

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

Тогда

toLower <$> "I AM LOWERCASE" == "ı am lowercase"  

Ответ 4

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

Ответ 5

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