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

Сложная программа

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 + русский язык = ?
От: awson  
Дата: 16.11.07 06:19
Оценка: 1 (1)
Здравствуйте, NotGonnaGetUs, Вы писали:

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


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

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


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

WinHUGS печатает русские буковки в кодировке ANSI...
Re[7]: haskell + русский язык = ?
От: _Eter_ http://mnazarov.ru
Дата: 19.12.07 18: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 11:45
Оценка:
Здравствуйте, _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 + русский язык = ?
От: Rtveliashvili Denys Великобритания  
Дата: 11.08.09 07: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 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 "Петя"
Петя

Чтобы это счастье заработало, пришлось скачать и установить эту либу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.