从 PHP 调用 swi-prolog 时出现编码问题
Posted
技术标签:
【中文标题】从 PHP 调用 swi-prolog 时出现编码问题【英文标题】:Problems with encoding while invoking swi-prolog from PHP 【发布时间】:2015-02-26 14:07:22 【问题描述】:我正在从 php 调用 SWI-prolog,发送问题并获得结果。我正在为此使用 exec() 函数:
$goal = "all_facts('S').";
$cmd = "/software/swipl/bin/swipl -f Domain.pl -g " . $goal . " -t halt";
谓词 all_facts() 返回有关县的事实,在本例中为正方形。
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>";
?>
【问题讨论】:
您如何捕获all_facts/1
调用的输出?
我在上面添加了 php 列表。
不熟悉 PHP,但您的代码看起来不错。您是否尝试过仅包含 ASCII 字符的事实?以便您确认这是编码问题?
是的。当我用 ASCII 字符测试代码时,一切正常。即使我从序言中接收俄语字符,它也能正常工作。但它没有正确发送它们。
我只能假设您还检查了包含 PHP 代码的源文件的编码,并确保与您的工作流程中使用的相同?
【参考方案1】:
根据对 cmets 的讨论,我建议您在Domain.pl
文件的第一行添加以下指令:
:- encoding(utf8).
并确保用于编辑文件的文本编辑器将其保存为 UTF-8 文件。 all_facts/1
谓词的修改版本现在应该写成 utf8
。
【讨论】:
以上是关于从 PHP 调用 swi-prolog 时出现编码问题的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 PHP 文件中调用方法时出现 ActionScript 错误
php增加用户时出现的【SQLSTATE[HY000] [2002]