Для типа данных Char, как я могу указать, что я хочу использовать турецкий я вместо английского я для функций toLower и toUpper?
Haskell, Char, Unicode и Turkish
Ответ 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
возможно, попробуйте установить свой язык? не уверен