Haskell IO с не английскими символами - PullRequest
4 голосов
/ 31 августа 2010

Посмотрите на это, я попробую

appendFile "out" $ show 'д'

'д' - символ русского алфавита. После этого «out» файл содержит:

'\1076'

Насколько я понимаю, это цифровой код Unicode символа 'д' Почему это происходит? И как я могу получить нормальное представление моего персонажа?

Для дополнительной информации это хорошо работает:

appendFile "out"  "д"

Спасибо.

Ответы [ 6 ]

4 голосов
/ 31 августа 2010

show экранирует все символы вне диапазона ASCII (и некоторые в пределах диапазона ASCII), поэтому не используйте show.

Так как "д" работает нормально, просто используйте это. Если вы не можете этого сделать, потому что д на самом деле находится внутри переменной, вы можете использовать [c] (где c - переменная, содержащая символ. Если вам нужно заключить его в одинарные кавычки (как в show), вы можете использовать ['\'', c, '\''].

3 голосов
/ 01 сентября 2010

После прочтения вашего ответа на мой комментарий я думаю, что ваша ситуация в том, что у вас есть некоторая структура данных, возможно, с типом [(String,String)], и вы хотите вывести ее для целей отладки. Использование show было бы целесообразно, но оно не должно включать символы, отличные от ASCII.

Проблема здесь не в юникоде, вам нужна функция, которая будет правильно форматировать ваши данные для отображения. Я не думаю, что show - правильный выбор, отчасти из-за проблем с экранированием некоторых персонажей. Вам нужен класс типа Show, но отображающий данные для чтения вместо экранирующих символов. То есть вам нужен симпатичный принтер, который представляет собой библиотеку, которая предоставляет функции для форматирования данных для отображения. В Hackage есть несколько симпатичных принтеров, для начала я бы посмотрел uulib или wl-pprint . Я думаю, что любой из них подойдет без особого труда.

Вот пример с инструментами uulib. Класс класса Pretty используется вместо Show, библиотека поставляется со многими полезными экземплярами.

import UU.PPrint

-- | Write each item to StdOut
logger :: Pretty a => a -> IO ()
logger x = putDoc $ pretty x <+> line

запустив это в ghci:

Prelude UU.PPrint> logger 'Д'
Д 
Prelude UU.PPrint> logger ('Д', "other text", 54)
(Д,other text,54) 
Prelude UU.PPrint> 

Если вы хотите выводить в файл вместо консоли, вы можете использовать функцию hPutDoc для вывода на дескриптор. Вы также можете вызвать renderSimple для получения SimpleDoc, затем сопоставить шаблон с конструкторами для обработки вывода, но это, вероятно, больше проблем. Что бы вы ни делали, избегайте show:

Prelude UU.PPrint> show $ pretty 'Д'
"\1044"

Вы также можете написать свой собственный класс типов, похожий на show, но отформатированный так, как вам нравится. Модуль Text.Printf может быть полезен, если вы идете по этому пути.

2 голосов
/ 31 августа 2010

Использовать Data.Text. Он обеспечивает поддержку ввода-вывода и поддержку кодирования.

0 голосов
/ 12 января 2018

В моем предыдущем решении не было кавычек.Кроме того, сейчас я поместил код в модуль, и модуль должен быть импортирован в вашу программу.

{-# LANGUAGE FlexibleInstances #-}

module M where

instance {-# OVERLAPPING #-} Show String where
    show x = ['"'] ++ x ++ ['"']

Информация для начинающих: помните, что в шоу ничего не отображается.show преобразует данные в строку с дополнительными символами форматирования.

Мы можем попробовать в WinGHCi: автоматически WinGHCi

*M> "ł"
"ł"
*M> "ą"
"ą"
*M> "ę"
"ę"
*M> ['ę']
"ę"
*M> ["chleb", "masło"]
["chleb","masło"]
*M> data T = T String deriving (Show)
*M> t = T "Chleb z masłem"

или вручную

*M> (putStrLn . show) "ł"
"ł"
*M> (putStrLn . show) "ą"
"ą"
*M> (putStrLn . show) "ę"
"ę"
*M> (putStrLn . show) ['ę']
"ę"
*M> (putStrLn . show) ["chleb", "masło"]
["chleb","masło"]
*M> data T = T String deriving (Show)
*M> t = T "Chleb z masłem"
*M> (putStrLn . show) t
T "Chleb z masłem"

В коде для отображения:

putStrLn "ł"
putStrLn "ą"
putStrLn "ę"
putStrLn "masło"
(putStrLn . show) ['ę']
(putStrLn . show) ["chleb", "masło"]
data T = T String deriving (Show)
t = T "Chleb z masłem"
(putStrLn . show) t

Я добавляю тэг "польские знаки haskell" для Google.

0 голосов
/ 10 января 2018

Для отображения национальных символов в шоу, введите свой код:

{-# LANGUAGE FlexibleInstances #-}

instance {-# OVERLAPPING #-} Show String where
    show = id

Вы можете попробовать:

*Main> show "ł"
ł
*Main> show "ą"
ą
*Main> show "ę"
ę
*Main> show ['ę']
ę
*Main> show ["chleb", "masło"]
[chleb,masło]
*Main> data T = T String deriving (Show)
*Main> t = T "Chleb z masłem"
*Main> t
T Chleb z masłem
*Main> show t
T Chleb z masłem
0 голосов
/ 31 августа 2010

Быстрый веб-поиск "UTF Haskell" должен дать вам хорошие ссылки.Вероятно, наиболее рекомендуемый пакет - это пакет text .

import Data.Text.IO as UTF
import Data.Text as T

main = UTF.appendFile "out"  (T.pack "д")
...