LINUX.ORG.RU

[CL] ECL и кодировки


0

1

Привет!

Разбираюсь с ECL. Все были ничего, пока не потребовалось работать с русскими словами, их нужно уметь вводить и выводить из скриптов на лиспе.

1. Ввод

int main(int argc,char **argv){
 cl_boot(argc,argv);
 cl_object obj=c_string_to_object("\"Привет!\"");
 cl_funcall(2,c_string_to_object("print"),obj);//печатаем "ÐÑивеÑ!"
 printf("\n");
 cl_eval(c_string_to_object("(format t \"~a~%\" \"Привет!\")"));//печатаем ÐÑивеÑ!
 /*
  * $ cat test.lisp
  * (format t "~a~%" "Прииивет!")
  */
 cl_eval(c_string_to_object("(load \"test.lisp\")"));//печатаем правильно
 printf("Привет!\n");//печатаем правильно
 cl_shutdown();
 return 0;}
Как побороть ecl и заставить его правильно понимать вводимые из исходника данные?

2.

/*
 * $cat test.lisp
 * (defun foo() "Прииииивет!")
 */
cl_eval(c_string_to_object("(load \"test.lisp\")"));
cl_object obj=cl_funcall(1,c_string_to_object("foo"));
printf("%s\n",obj->string.self); //пусто. если из фу возвращать "foo", все ок

Смотрел в EQL функции toCString и toQString (вроде так называются) (да, вариант с использованием Qt вполне подойдет), но получал абракадабры, один раз что-то вроде ÐÑивеÑ!, второй - одни знаки вопросов.

Я сейчас разбираюсь в исходниках екаэля, но на это может йти много времени. Если кто сталкивался или просто имеет веское мнение, варианты решения приветствуются. Судя по докам ECL полностью реализует анси-коммон-лисп, поэтому решение из более традиционных sbcl и clisp может быть тоже подойдут...

Локаль в системе en_US.UTF-8.

★★★★★

И исходник, и test.lisp тоже в utf-8.

staseg ★★★★★
() автор топика

И еще чуть-чуть, забыл написать сразу. ecl-11.1.1, собран с флагом unicode.

staseg ★★★★★
() автор топика
Ответ на: комментарий от dmitry_vk

>Я предположу, что может не хватать вызова setlocale(LC_ALL, "") вначале.

Не помогло.

staseg ★★★★★
() автор топика

А сейчас попробовал выводить не в консоль, а в Qt-шный гуй, все вывелось правильно... Использовал функцию из EQL. При этом в консоль результаты этой же функция печатались знаками вопросов...

static QString toQString(cl_object l_str) {
    QString s;
    if(ECL_STRINGP(l_str)) {
        if(ECL_BASE_STRING_P(l_str)) {
            s = QString::fromLatin1((char*)l_str->base_string.self, l_str->base_string.fillp); }
        else {
            uint l = l_str->string.fillp;
            s.reserve(l);
            ecl_character* l_s = l_str->string.self;
            for(uint i = 0; i < l; ++i) {
                s[i] = QChar(l_s[i]); }}}
    return s; }
staseg ★★★★★
() автор топика
int main(int argc,char **argv){
...
cl_shutdown();
return 0;}

Шаблон порвался. А где знаменитые скобочки?? Где синтаксис лесенкой?

delete83 ★★
()
Ответ на: комментарий от delete83

Шаблон порвался. А где знаменитые скобочки?? Где синтаксис лесенкой?

EmbeddableCL, там сишная часть.

quasimoto ★★★★
()
Ответ на: комментарий от tis

Похоже, что у тебя не та локаль в консоли установлена. Стоит что-то типа «С» ...

LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=POSIX
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Я тут немного потестировал и посоображал...

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
qDebug()<<QString("Пыщ"); // ???
qDebug()<<QString("Пыщ").toAscii().data(); // ???
printf("%s\n",QString("Пыщ").toAscii().data()); // Пыщ

То есть qDebug сам по себе отказывается нормально печатать слова. Но на это можно забить, это совсем пофиг. В общем с помощью toQString получилось получить человекочитаемые данные из ecl-рантайма, они нормально выводятся в консоль через printf и нормально печатаются в гуе.

Сейчас еще потестил. Если не устанавливать текст-кодек, qDebug и printf текст из исходника печатают правильно, но тогда кракозябры в гуе и частично ломается метод выбора текста из лисп-рантайма: в гуе этот текст пишется правильно, а ни qDebug-ом, ни printf-ом не выводится.

Хоть проблему и можно считать решенной, я все равно чувствую себя неосилятором кодировок и, думаю, в следующий подобный раз проблема опять будет решаться методом тыка :(

staseg ★★★★★
() автор топика
Ответ на: комментарий от delete83

Ты ни разу не видел С- и лиспо-кода, и не можешь их отличить? Или просто скор набить зашел?

staseg ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.