从PHP调用swi-prolog时出现编码问题

问题描述 投票:0回答:1

我正在从PHP调用SWI-prolog,发送问题并获得结果。我为此使用exec()函数:

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

谓词all_facts()返回有关县的事实,在此示例中为正方形。

在我的网站的序言文件中,有很多关于俄罗斯国家/地区的事实。SWI-prolog返回带有俄语符号的答案,并且一切正常。

例如,当我尝试在请求中使用俄语符号时,问题就出现了:

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

然后,我完全在SWI-prolog中运行此请求,我得到了正确的答案。但是后来我从PHP询问,我根本找不到答案。

所以,我想,在发送请求时会出现错误,并且SWI-prolog的问题被扭曲了,所以找不到答案。

我已经更改了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>";
?>
php encoding swi-prolog
1个回答
0
投票

基于对注释的讨论,建议您在Domain.pl文件的第一行中添加以下指令:

:- encoding(utf8).

,并确保用于编辑文件的文本编辑器将其另存为UTF-8文件。您修改后的all_facts/1谓词版本现在应写为utf8

© www.soinside.com 2019 - 2024. All rights reserved.