haskell + русский язык = ?
От: NotGonnaGetUs 
Дата: 15.11.07 15:20
Возникла трудность, надеюсь, решаемая...

Сложная программа
main = print "Петя"

Выводит в консоль фразу "\1055\1077\1090\1103"

Я пользуюсь eclipse в качестве редактора кода и там выставлено UTF-8 в качестве 'text file encoding'. Без этого ghc вообще не собирает программу.

Как сделать так, чтобы в консоле можно было писать русские слова? Может есть какая-то библиотека для этих целей...
Поиски в гугль пока не дали результата.
Re: haskell + русский язык = ?
От: deniok 
Дата: 15.11.07 17:05
Здравствуйте, NotGonnaGetUs, Вы писали:

NGG>Как сделать так, чтобы в консоле можно было писать русские слова?


Вроде нужно UTF8 конвертнуть в кодовую страницу консоли: было обсуждение здесь.
Re: haskell + русский язык = ?
От: R.K. 
Дата: 15.11.07 19: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 + русский язык = ?
От: awson 
Дата: 16.11.07 05:19
Оценка:1 (1)
Здравствуйте, NotGonnaGetUs, Вы писали:

NGG>Возникла трудность, надеюсь, решаемая...


Как раз подоспел вполне внятный обзор.
Re[2]: haskell + русский язык = ?
От: Курилкаhttp://kirya.narod.ru/
Дата: 16.11.07 05:28
Оценка: +1
Здравствуйте, 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 06: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 + русский язык = ?
От: Курилкаhttp://kirya.narod.ru/
Дата: 16.11.07 06:19
Здравствуйте, 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 10:14
Здравствуйте, Курилка, Вы писали:

К>кто-то "почикал" тот пост


Щас он есть, более того — снова заработала старая ссылка.
Re[6]: haskell + русский язык = ?
От: NotGonnaGetUs 
Дата: 16.11.07 12:41
Оценка: :))
Здравствуйте, 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 + русский язык = ?
От: genieprohttp://geniepro.livejournal.com/
Дата: 16.11.07 15:04
Здравствуйте, NotGonnaGetUs, Вы писали:

WinHUGS печатает русские буковки в кодировке ANSI...
Re[7]: haskell + русский язык = ?
От: _Eter_http://mnazarov.ru
Дата: 19.12.07 17:48
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 + русский язык = ?
От: NotGonnaGetUs 
Дата: 20.12.07 10:45
Здравствуйте, _Eter_, Вы писали:

_E_>В Linux у меня получился правильный вывод:


Охотно верю. В виндоус, к сожалению, консоль несколько бажная. Пробовал cygwin — но это просто обёртка над cmd и её багами.
Re: haskell + русский язык = ?
От: lant 
Дата: 10.08.09 09: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 + русский язык = ?
От: Rtveliashvili Denys 
Дата: 11.08.09 06:13
_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 16: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 "Петя"
Петя

Чтобы это счастье заработало, пришлось скачать и установить эту либу