swi-prolog と php の間のインターフェイスを作成しています。php は、prolog に実行させたいコマンドをファイルに書き込み、次にシステム コールを実行して、prolog がファイルを実行するようにします。問題は、ファイルに特殊文字 (á、í、ã、ê など) がある場合、これらの文字がプロローグからの出力で \uFFFD に置き換えられることです。このコードポイントは不明/未確認用であることを知っていますcodepointsですが、インターネットで見つけた問題を解決できませんでした。自分でターミナルからファイルを実行すると、正しい文字が表示されます.phpがexecまたはshell_execから実行されたときに、理由が失われたように見えます.
使用するコードは次のとおりです。最初に php を使用します。
$arquivo = fopen("/home/giz/prologDB/run.pl", w);
$run = <<<EOT
go :-
consult('/home/giz/prologDB/pessoasOps.pl'),
addPessoa(0,'$name','$posicao','$resume','$unidade','$curso','$disciplina',$alunos,[]),
halt.
EOT;
echo $run;
fwrite($arquivo, $run);
$cmd = "prolog -f /home/giz/prologDB/run.pl -g go";
exec( $cmd, $output );
echo "\n";
print_r( $output );
echo "\n";
プロローグコード:
addPessoa(LOCAL, NOME, POSICAO, RESUMO, UNIDADE, CURSO, DISCIPLINA, ALUNOS, REFERENCIA):-
write( 'Prolog \nwas called \nfrom PHP \nsuccessfully.\n' ),
write('pessoa('),
write(LOCAL),
write(',\''),
write(NOME),
write('\',\''),
write(POSICAO),
write('\',\''),
write(RESUMO),
write('\',\''),
write(UNIDADE),
write('\',\''),
write(CURSO),
write('\',\''),
write(DISCIPLINA),
write('\','),
write(ALUNOS),
write(','),
write(REFERENCIA),
write(').\n'),
make.
誰かが文字列を正しく解釈する方法を知っていますか?