haskell: чтение специальных символов из консоли - PullRequest
6 голосов
/ 10 сентября 2011

Я хотел бы прочитать строку из консоли, которая содержит специальные символы, такие как ö, ä, ü, µ ... Я пробовал:

do ... ts <- getLine ... </p>

но это не работает для этого персонажа.Например, unicode для ö - это \ 246, но если я использую getLine для чтения в ö, haskell читает в «\ 195 \ 182», а putStr «\ 195 \ 182» дает мне ö, а не ö.В чем здесь проблема?Нужна ли другая функция для чтения этих символов?

Я использую WinGHCi 7.0.3 на Windows XP.Я был бы рад, если бы кто-то мог помочь мне, потому что я ничего не нашел до сих пор.


@ Judah Jacobson:

Я попробовал еще раз, прежде чем вводить какие-либо другие команды,и получил это:

Prelude> :m +System.IO
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> getLine
ασδφ
"\206\177\207\402\206\180\207\8224"
Prelude System.IO> putStr "\206\177\207\402\206\180\207\8224"
ασδφPrelude System.IO> 

Я также попробовал команду windows chcp 65001, но она ничего не изменила, у меня уже активирован utf8 в windows.

Ответы [ 3 ]

3 голосов
/ 10 сентября 2011

Поскольку строки GHC 6.12 обрабатываются как UTF8 на входе и выходе (или с другой кодировкой, основанной на вашей настройке локали).Поэтому убедитесь, что для вашей локали установлено, например, UTF8.

Вы также можете вручную управлять этим материалом через пакет text , который поддерживает многие другие соглашения и кодировки локали.

2 голосов
/ 12 сентября 2011

Вам нужно установить кодировку стандартного ввода в UTF8.Для меня это установлено на CP437 первоначально в GHCi в Windows XP, и на UTF8 на Mac.

Проверьте с помощью hGetEncoding stdin (System.IO) и установите с помощью hSetEncoding stdin utf8, и оно должно работать.

Редактировать : На моем Mac это выглядит так:

Prelude System.IO> hSetEncoding stdin latin1
Prelude System.IO> str <- getLine
ö
Prelude System.IO> putStr str
öPrelude System.IO> print str
"\195\182"
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> str <- getLine
ö
Prelude System.IO> putStr str
öPrelude System.IO> print str
"\246"
1 голос
/ 15 сентября 2011

Я смог воспроизвести вашу ошибку;это похоже на ошибку в WinGHCi.По умолчанию GHC в Windows использует Win32 «консольную кодовую страницу» для кодирования и декодирования Handle I / O.Однако WinGHCi отправляет входные данные в GHC в виде байтов в кодировке UTF8, но неправильно настроена кодовая страница 1252 (Latin-1).

Я смог обойти эту ошибку, используя ответ Майка Хартла: run hSetEncoding stdin utf8 перед выполнением любых команд линейного ввода.Например:

Prelude> :m +System.IO
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> getLine
ασδφ
"\945\963\948\966"

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

С другой стороны, вам, вероятно, повезет больше, Unicodeс программой «GHCi» (которая, по общему признанию, имеет менее приятный графический интерфейс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...