GHC усекает вывод символов Unicode

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

Я не думаю, что это моя оболочка, потому что я могу заставить ruby ​​сделать это:

irb> puts "\u221A"
√

GHC/GHCi — еще одна проблема:

ghci> putStrLn "\8730"

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

Так что я делаю неправильно?

(GHC v6.l0.3)


person rampion    schedule 13.04.2011    source источник


Ответы (1)


Поведение GHC с юникодом изменено в GHC 6.12.1 на "делать правильные вещи" со строками Unicode. Предыдущие версии усекают до 8-битных символов при вводе-выводе (вынуждая использовать библиотеку кодирования).

То есть «\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"

поскольку биты Unicode усекаются до 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), чтобы получить полную поддержку Unicode? Если это невозможно, вы можете использовать одну из библиотек кодирования, например utf8-string

person Don Stewart    schedule 13.04.2011
comment
Я обновлю, если смогу, но если нет, спасибо за указатель библиотеки! - person rampion; 14.04.2011