haskell + русский язык = ?
Возникла трудность, надеюсь, решаемая...
Сложная программа
main = print "Петя"
Выводит в консоль фразу "\1055\1077\1090\1103"
Я пользуюсь eclipse в качестве редактора кода и там выставлено UTF-8 в качестве 'text file encoding'. Без этого ghc вообще не собирает программу.
Как сделать так, чтобы в консоле можно было писать русские слова? Может есть какая-то библиотека для этих целей...
Поиски в гугль пока не дали результата.
Re: haskell + русский язык = ?
От:
deniok
Дата: 15.11.07 18:05
Оценка:
Здравствуйте, NotGonnaGetUs, Вы писали:
NGG>Как сделать так, чтобы в консоле можно было писать русские слова?
Вроде нужно UTF8 конвертнуть в кодовую страницу консоли: было обсуждение
здесь .
Re: haskell + русский язык = ?
От:
R.K.
Дата: 15.11.07 20:45
Оценка:
Здравствуйте, NotGonnaGetUs, Вы писали:
NGG>Возникла трудность, надеюсь, решаемая...
Я делал так: сами исходники в ANSI-кодировке, собирается небольшая утилита (prepRus) эскапирования незнакомых русских символов:
module Main where
import Data.Char
import Numeric
import System.Environment
proc :: String -> String
proc [] = []
proc (x:xs)
| '\xC0' <=x && x<='\xFF'
= ('\\' :)
$ ('x' :)
$ (showHex $ ord x)
$ proc xs
| otherwise = x : proc xs
main = do
(inName:_:outName:_) <- getArgs
s <- readFile inName
writeFile outName $ proc s
Параметры GHC такие: -F -pgmF prepRus
Для вывода строк в консоль следующий модуль:
module System.ConsoleRus
( winToDos, dosToWin
, w2d, d2w
, putc, putcLn
, showInFrame, showInFrameDigs
) where
import Data.Array .Unboxed
import IO
-- соответствующие конвертации символов в строках
w2d, d2w :: String -> String
w2d = map winToDos
d2w = map dosToWin
-- конвертация символов ANSI->OEM и OEM->ANSI
winToDos, dosToWin :: Char -> Char
winToDos = tableConvert
[ "\x5F\x5F\x27\x5F\x22\x3A\xC5\xD8\x5F\x25\x5F\x3C\x5F\x5F\x5F\x5F"
, "\x5F\x27\x27\x22\x22\x07\x2D\x2D\x5F\x54\x5F\x3E\x5F\x5F\x5F\x5F"
, "\xFF\xF6\xF7\x5F\xFD\x5F\xB3\x15\xF0\x63\xF2\x3C\xBF\x2D\x52\xF4"
, "\xF8\x2B\x5F\x5F\x5F\xE7\x14\xFA\xF1\xFC\xF3\x3E\x5F\x5F\x5F\xF5"
, "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F"
, "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F"
, "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"
, "\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF"
]
dosToWin = tableConvert
[ "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF"
, "\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF"
, "\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF"
, "\x2D\x2D\x2D\xA6\x2B\xA6\xA6\xAC\xAC\xA6\xA6\xAC\x2D\x2D\x2D\xAC"
, "\x4C\x2B\x54\x2B\x2D\x2B\xA6\xA6\x4C\xE3\xA6\x54\xA6\x3D\x2B\xA6"
, "\xA6\x54\x54\x4C\x4C\x2D\xE3\x2B\x2B\x2D\x2D\x2D\x2D\xA6\xA6\x2D"
, "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
, "\xA8\xB8\xAA\xBA\xAF\xBF\xA1\xA2\xB0\x95\xB7\x76\xB9\xA4\xA6\xA0"
]
putc, putcLn :: String -> IO ()
putc a = putStr (w2d a) >> hFlush stdout
putcLn a = putStrLn (w2d a) >> hFlush stdout
tableConvert :: [String ] -> Char -> Char
tableConvert xs = (!) (listArray ('\x00' , '\xff' ) $
['\x00' ..'\x7f' ] ++ concat xs :: UArray Char Char )
-- обрамить псевдографикой список строк
showInFrame :: [String ] -> String
showInFrame xs =
'\n' :'\xDA' :replicate width '\xC4' ++
'\xBF' :'\n' :concatMap (\x -> '\xB3' :x ++ "\xB3\n" ) xs ++
'\xC0' :replicate width '\xC4' ++ "\xD9"
where
height = length xs
width = maximum $ map length xs
xsPad = map (\x -> take width $ x ++ repeat ' ' ) xs
-- обрамить псевдографикой список строк и поместить координаты по бокам
showInFrameDigs :: [String ] -> String
showInFrameDigs xs = concatMap ('\n' :) $
(' ' :' ' :take width digs) : zipWith (:) vertDigs fs
where
(_:fs) = lines $ showInFrame xs
width = length (head fs) - 2
digs = ['1' ..'9' ] ++ '0' :digs
vertDigs = ' ' : take width digs ++ repeat ' '
Для примера можно посмотреть консольную версию Балды 2G:
[Haskell] Балда 2GАвтор: R.K. Дата: 13.12.06
You aren't expected to absorb this
Re: haskell + русский язык = ?
Здравствуйте, NotGonnaGetUs, Вы писали:
NGG>Возникла трудность, надеюсь, решаемая...
Как раз подоспел
вполне внятный обзор .
Re[2]: haskell + русский язык = ?
Здравствуйте, awson, Вы писали:
A>Здравствуйте, NotGonnaGetUs, Вы писали:
NGG>>Возникла трудность, надеюсь, решаемая...
A>Как раз подоспел вполне внятный обзор .
The requested URL /2007/10/survey-haskell-unicode-support.html was not found on this server.
Re[3]: haskell + русский язык = ?
От:
awson
Дата: 16.11.07 07:08
Оценка:
Здравствуйте, Курилка, Вы писали:
К>К>The requested URL /2007/10/survey-haskell-unicode-support.html was not found on this server.
Действительно. Тогда просто
здесь смотреть пост за 15 ноября — Survey: Haskell Unicode support.
Re[4]: haskell + русский язык = ?
Здравствуйте, awson, Вы писали:
A>Здравствуйте, Курилка, Вы писали:
К>>К>>The requested URL /2007/10/survey-haskell-unicode-support.html was not found on this server.
A>Действительно. Тогда просто здесь смотреть пост за 15 ноября — Survey: Haskell Unicode support.
Дак ты сам-то нашёл? Или у тебя в кэше что-то застряло?
Вот первая строчка блога:
Friday, 9 November 2007
Release: libfishsound 0.8.1
кто-то "почикал" тот пост
Re[5]: haskell + русский язык = ?
От:
awson
Дата: 16.11.07 11:14
Оценка:
Здравствуйте, Курилка, Вы писали:
К>кто-то "почикал" тот пост
Щас он есть, более того — снова заработала старая ссылка.
Re[6]: haskell + русский язык = ?
Здравствуйте, awson, Вы писали:
A>Щас он есть, более того — снова заработала старая ссылка.
Спасибо за ссылку...
Попробовал вариант utf8-string. Насколько я понял, эта штука повзволяет выплюнуть в консоль строку в utf8.
Поставил в консоле "chcp 65001" для того, чтобы она понимала utf8.
При попытке выполнить:
main =
do
System.IO .UTF8.putStrLn $ "петя"
получил такой output:
C:\xxx\bin>theResult.exe
петя
я
петятяяпетятяяtheResult.exe: <stdout>: hPutChar: permission denied (Permission denied)
Очень любопытный результат
Если загонять результат в файл, то можно потом его прочесть в интернет эксплорере или notepad++...
Попозже попробую последний вариант.
Re: haskell + русский язык = ?
Здравствуйте, NotGonnaGetUs, Вы писали:
WinHUGS печатает русские буковки в кодировке ANSI...
Re[7]: haskell + русский язык = ?
NGG>получил такой output:
NGG>NGG>C:\xxx\bin>theResult.exe
NGG>петя
NGG>я
NGG>петятяяпетятяяtheResult.exe: <stdout>: hPutChar: permission denied (Permission denied)
NGG>
NGG>Очень любопытный результат
NGG>Если загонять результат в файл, то можно потом его прочесть в интернет эксплорере или notepad++...
NGG>Попозже попробую последний вариант.
В Linux у меня получился правильный вывод:
eter@localhost ~/Projects/HS $ ./sss
петя
eter@localhost ~/Projects/HS $
PS: Gentoo x86_64, GHC 6.8.1
Re[8]: haskell + русский язык = ?
Здравствуйте, _Eter_, Вы писали:
_E_>В Linux у меня получился правильный вывод:
Охотно верю. В виндоус, к сожалению, консоль несколько бажная. Пробовал cygwin — но это просто обёртка над cmd и её багами.
Re: haskell + русский язык = ?
От:
lant
Дата: 10.08.09 10:03
Оценка:
Здравствуйте, NotGonnaGetUs, Вы писали:
NGG>NGG>main = print "Петя"
NGG>
NGG>Выводит в консоль фразу "\1055\1077\1090\1103"
проблема решается так:
module Main where
import Codec.Binary.UTF8.String (utf8Encode)
main = putStrLn $ utf8Encode "здравствуй мир!"
Re[8]: haskell + русский язык = ?
_E_>В Linux у меня получился правильный вывод:
_E_>_E_>eter@localhost ~/Projects/HS $ ./sss
_E_>петя
_E_>eter@localhost ~/Projects/HS $
_E_>
_E_>PS: Gentoo x86_64, GHC 6.8.1
Это просто потому что в Linux стандартная кодировка в консоли — UTF-8 (проверяется командой locale). В общем случае текст в консоль нужно выводить в кодировке этой самой консоли. Но самая передовая реализация Haskell (ghc) забила на это сами знаете что, так что прийдется корячиться и делать все вручную. Кстати, в этом плане hugs был лучше, если ничего не путаю. Тема, вообще-то избитая и больная. Но воз и ныне там.
Re: haskell + русский язык = ?
От:
GreenTea
Дата: 30.01.10 17:12
Оценка:
Здравствуйте, NotGonnaGetUs, Вы писали:
NGG>Возникла трудность, надеюсь, решаемая...
NGG>Сложная программа
NGG>NGG>main = print "Петя"
NGG>
NGG>Выводит в консоль фразу "\1055\1077\1090\1103"
NGG>Я пользуюсь eclipse в качестве редактора кода и там выставлено UTF-8 в качестве 'text file encoding'. Без этого ghc вообще не собирает программу.
NGG>Как сделать так, чтобы в консоле можно было писать русские слова? Может есть какая-то библиотека для этих целей...
NGG>Поиски в гугль пока не дали результата.
У меня Win 7. Помогло перекодирование в cp866:
import Data.Encoding
import System.IO.Encoding
cp866 = (encodingFromString "cp866" )
rusPrint :: String -> IO ()
rusPrint = let ?enc = cp866 in System.IO.Encoding.putStrLn
*Test> rusPrint "Петя"
Петя
Чтобы это счастье заработало, пришлось скачать и установить
эту либу
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить