Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Функциональные языки: общие вопросы > [Haskell] кириллица


Автор: Artemios 18.1.2007, 01:05
Haskell и кириллица -- есть ли возможность как-нибудь подружить, кроме как таким способом:
Код

map chr [1042, 1099, 1088, 1077, 1079, 1072, 1090, 1100]

Когда пытаюсь просто в кавычках записать строку с кириллицей -- компилятор (ghc) ругается на лексическую ошибку.

Автор: DrDred 18.1.2007, 10:35
Счас проверил ghc 6.4.2 - если файл сохранен в UTF-8 то все нормально... правда т.к. консоль не юникодная, то пользы от этого маловато smile

Автор: Artemios 18.1.2007, 13:33
Странно... Вся система utf-8, включая и консоль.
SuSE Linux 10.1
ghc-6.4.2
Что получается:
Цитата

~> cat > test1.hs

main = print "Tralala"


~> ghc --make ./test1.hs -o test1

Chasing modules from: ./test1.hs
Compiling Main             ( ./test1.hs, ./test1.o )
Linking ...

~> ./test1

"Tralala"

~> cat > test2.hs

main = print "Траляля"


~> ghc --make ./test2.hs -o test2

Chasing modules from: ./test2.hs
Compiling Main             ( ./test2.hs, ./test2.o )

./test2.hs:1:18: lexical error in string/character literal

~>    


Добавлено @ 13:38 
P.S. пакет с ghc качал с PACKMAN-а, может у них он собран без поддержки юникода?

Автор: DrDred 18.1.2007, 14:22
а cat точно создает utf-8 файл? Про Linux сказать ничего не могу, т.к. тестировал под Виндой...

Автор: Artemios 18.1.2007, 15:00
Цитата(DrDred @  18.1.2007,  14:22 Найти цитируемый пост)
а cat точно создает utf-8 файл?

угу. Он писал в файл то, что я вводил с консоли, а в консоли utf. На всякий случай проверил -- действительно utf.

Цитата(Artemios @  18.1.2007,  13:33 Найти цитируемый пост)
P.S. пакет с ghc качал с PACKMAN-а, может у них он собран без поддержки юникода? 

попробовал бинарники от разработчиков с офф. сайта -- та же беда.
Приду домой, в Винду попробую загрузиться, там еще посмотрю... Хотя, для cp1251 там проверял -- также не хотело...
Но не может же быть такого, чтоб под виндой была поддержка, а под *nix -- нет?

DrDred, а у тебя откуда дистрибутив?

Автор: DrDred 18.1.2007, 15:36
Черт, извиняюсь похоже прогнал с utf-8 smile не ту версию файла скопмилировал.... 
А вот с cp1251 все хорошо... Брал дистрибутив с haskell.org, вроде ничего не докручивал...

Автор: Artemios 18.1.2007, 16:59
Опа...
Я похоже тоже прогнал:
Цитата(Artemios @  18.1.2007,  15:00 Найти цитируемый пост)
Хотя, для cp1251 там проверял -- также не хотело...

и наверно тот же utf-8 в Винде компилировал...

Сейчас под Linux-ом попробовал koi8-r -- все замечательно собирается и запускается smile
Цитата

~> recode utf8..koi8r < ./test2.hs > ./test3.hs

~> ghc --make ./test3.hs -o ./test3

Chasing modules from: ./test3.hs
Compiling Main             ( ./test3.hs, ./test3.o )
Linking ...

~> ./test3

"\244\210\193\204\209\204\209"

~>       

Значит, вопрос не в кириллице, а в поддержке юникода.

Автор: Artemios 23.1.2007, 16:14
Вообще, вопрос темы возник по следующему поводу:
начал баловаться с построение ГУИ с использованием библиотеки gtk2hs
Тут выяснилось, что строки с не-ascii символами GTK кушает в юникоде.

Решил: если гора не идет к Магомеду -- Магомед идет к горе. Написал скриптик (если кому нужен -- присоединяю к сообщению), который разбирает программу на Haskell и заменяет строки, содержащие не-ascii символы, на представление вида (map chr [список hex-значений символов в юникоде]). Теперь могу писать в любой кодировке и использовать любые строки, а после обработки скриптом все замечательно компилируется и работает хоть в Линуксе, хоть в Винде.
Скрипт писал на Python -- соответственно понимает все кодировки, что понимает питон (а это если и не все, то большинство ныне используемых кодировок). В большинстве дистрибутивов линукса питон установлен по умолчанию, под виндусом пробовал с установленным питоном, но при желании можно собрать и независимый от питона экзешник.

Ниже привожу пример использования (скрипт назвал notascii2haskell smile ), за свой хилый английский извиняюсь.
Цитата

~> ./notascii2haskell --help

notascii2haskell - converts Haskell programs with strings in various not-ascii character sets
        to programs with 'gtk2hs'-understandable replacements for strings


Usage:  notascii2haskell [ENCODING] [INFILE [OUTFILE]]
                        ENCODING - encoding of input characters, on default encoding of current locale used
                        INFILE - input file name, on default stdin stream used
                        OUTFILE - output file name, on default stdout stream used

        notascii2haskell --help         show help message
        notascii2haskell --all-enc      show all supported encodings (with aliases)


~> cat > ./RButton.hs
module Main (main) where

import Graphics.UI.Gtk
import Data.Char

main :: IO ()
main = do
  initGUI
  window <- windowNew
  button <- buttonNewWithLabel "Кириллическая кнопка"
  set window [ containerChild := button ]
  button `onClicked` mainQuit
  window `onDestroy` mainQuit
  widgetShowAll window
  mainGUI


~> ./notascii2haskell ./RButton.hs
module Main (main) where

import Graphics.UI.Gtk
import Data.Char

main :: IO ()
main = do
  initGUI
  window <- windowNew
  button <- buttonNewWithLabel (map chr [0x41a,0x438,0x440,0x438,0x43b,0x43b,0x438,0x447,0x435,0x441,0x43a,0x430,0x44f,0x20,0x43a,0x43d,0x43e,0x43f,0x43a,0x430])
  set window [ containerChild := button ]
  button `onClicked` mainQuit
  window `onDestroy` mainQuit
  widgetShowAll window
  mainGUI

~> ./notascii2haskell ./RButton.hs ./RB.hs
~> ghc --make ./RB.hs -o ./RB
Chasing modules from: ./RB.hs
Compiling Main             ( ./RB.hs, ./RB.o )
Linking ...
~> ./RB

и после выполнения последней строчки имею окошко с кнопкой:
user posted image

Предложения по дополнению/улучшению принимаются smile

Автор: Laughedelic 11.10.2007, 20:49
у меня такая же проблема с кириллицей в Хаскелле.
кроме этого скрипта никто не придумал, других решений?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)