Проблемы с кодировкой при вызове swi-prolog из Stack Overflow

Я вызываю swi-пролог из php, отправляю вопрос и получаю результат. я использую Exec () функция для этого:

$goal = "all_facts('S').";
$cmd = "/software/swipl/bin/swipl -f Domain.pl -g ".$goal." -t halt";

Предикат all_facts () возвращает факты о графствах, в этом примере — квадрат.

Есть много фактов о странах на русском языке в файле пролога, как это нужно для моего сайта.
SWI-пролог возвращает ответ с русскими символами и все в порядке.

Проблема возникает, когда я пытаюсь использовать русские символы в запросе, например:

 $goal = "all_facts('Столица').";

Тогда я запускаю этот запрос именно в SWI-прологе, я получаю правильный ответ. Но тогда я спрашиваю это от php, я не получаю ответ вообще.

Так что, я думаю, при отправке запроса появляются ошибки, а swi-пролог получает искаженный вопрос, поэтому не может найти ответ.

Я уже изменил кодировку SWI-Prolog (используя переменную окружения LANG), кодировку страницы, попытался изменить кодировку php exec (не уверен, работает ли он).
Возможно, мне действительно нужно изменить кодировку php exec, но я делаю это неправильно.

Пожалуйста помоги!

На всякий случай, часть файла пролога:

facts('Австралия','S', 7686850).
facts('Австрия', 'S', 83871).
facts('Азербайджан','S', 86600).
facts('Австралия','Столица', 'Канберра').
facts('Австрия', 'Столица', 'Вена').
facts('Азербайджан','Столица', 'Баку').
all_facts(C):- findall(X:Y, facts(X,C,Y), All), write(All).

Код PHP:

<?
$goal = "all_facts('Столица').";
$cmd = "/software/swipl/bin/swipl -f Domain.pl -g ".$goal." -t halt";
if (exec($cmd)) {$output = exec($cmd);}
else {echo "Error!";}
$output = str_replace(array("[","]"), "", $output);
$facts = explode(",", $output);
$length = count($facts);
echo "<ul>";
for ($i=0; $i<$length; $i++) {
$all_facts[$i]= explode(":", $facts[$i]);
echo "<li>",$all_facts[$i][0], " - " ,$all_facts[$i][1],"</li>";
}
echo "</ul>";
?>

0

Решение

Основываясь на обсуждении комментариев, я предлагаю вам добавить на первая строка из Domain.pl подать следующую директиву:

:- encoding(utf8).

и убедитесь, что текстовый редактор, используемый для редактирования файла, сохраняет его как файл UTF-8. Ваша модифицированная версия all_facts/1 Предикат теперь должен написать utf8,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]