[CL] ECL и кодировки
Привет!
Разбираюсь с 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;}
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.