从 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】:

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

:- encoding(utf8).

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

【讨论】:

以上是关于从 PHP 调用 swi-prolog 时出现编码问题的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 PHP 文件中调用方法时出现 ActionScript 错误

php增加用户时出现的【SQLSTATE[HY000] [2002]

尝试从数据库打印结果时出现未定义的错误

servlet从mysql中取数据时出现的汉字编码问题

尝试从 Mandrill 发送电子邮件时出现 html 或车把编码问题

多重通知:调用函数时出现未定义的变量错误[重复]