Поведение GHC с юникодом изменено в GHC 6.12.1 , чтобы "делать правильные вещи" со строками Юникода.Предыдущие версии усекаются до 8-битных символов в IO (что заставляет использовать библиотеку кодирования).
То есть «\ 8730» - это 0x221a, а «\ SUB» - 0x1a - старший байт пропал.
Здесь с GHC 7:
Prelude> print "√\n"
"\8730\n"
Prelude> putStr "√\n"
√
Prelude> putStr "\8730√\n"
√√
Но я получаю ваш результат с GHC 6.8.Например:
Prelude> writeFile "/tmp/x" "√\n"
Prelude> readFile "/tmp/x"
"\SUB\n"
, поскольку биты Юникода усекаются до 8 бит.
GHC 7 + IO работает как положено:
Prelude> writeFile "/tmp/x" "\8730√\n"
Prelude> readFile "/tmp/x"
"\8730\8730\n"
Prelude> s <- readFile "/tmp/x"
Prelude> putStr s
√√
Можете ли вы обновить доGHC 7 (в Haskell Platform ), чтобы получить полную поддержку Unicode?Если это невозможно, вы можете использовать одну из библиотек кодирования, например utf8-string