GHC - усечение вывода символов Юникода - PullRequest
3 голосов
/ 14 апреля 2011

Я не могу заставить GHCi или GHC напечатать кодовую точку Unicode 221A (символ sqrt: √).

Я не думаю, что это моя оболочка, потому что я могу получить рубин, чтобы сделать это:

irb> puts "\u221A"
√

GHC / GHCi - это еще одна проблема:

ghci> putStrLn "\8730"

ghci> withFile "temp.out" WriteMode $ flip hPutStrLn "\8730"
ghci> readFile "temp.out"
"\SUB\n"

Так что я делаю не так?

(GHC v6.10.3)

1 Ответ

10 голосов
/ 14 апреля 2011

Поведение 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

...