После прочтения вашего ответа на мой комментарий я думаю, что ваша ситуация в том, что у вас есть некоторая структура данных, возможно, с типом [(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
может быть полезен, если вы идете по этому пути.