从php调用swi-prolog时编码的问题

时间:2015-02-26 14:07:23

标签: php encoding swi-prolog

我从php调用swi-prolog,发送问题并获得结果。我使用 exec()函数:

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

谓词 all_facts()会返回有关县的事实,在本例中为square。

我的网站需要prolog文件中有很多关于俄语国家的事实。 SWI-prolog用俄语符号返回一个答案,每件事都没问题。

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

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

然后我正好在SWI-prolog中运行这个请求,我得到了正确的答案。但是我从php那里问它,我根本得不到答案。

所以,我猜,发送请求时会出现错误,并且swi-prolog会出现扭曲的问题,因此无法找到答案。

我已经改变了SWI-Prolog的编码(使用环境变量LANG),页面编码,试图改变php exec的编码(不确定,如果它有效)。 也许,我真的需要改变php exec编码,但做错了。

请帮忙!

以防万一,prolog文件的一部分:

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>";
?> 

1 个答案:

答案 0 :(得分:0)

根据对评论的讨论,我建议您在Domain.pl文件的第一行添加以下指令:

:- encoding(utf8).

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