0

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.

誰かが文字列を正しく解釈する方法を知っていますか?

4

1 に答える 1

0

ほとんどの場合、Prolog は UTF-8 でエンコードされた文字を想定しており、ISO-8859-n文字を入力しています。n はおそらく 1 または 15 です。UTF-8では、バイト >= 128 が見られる場合、最初のマルチバイト シーケンス (>= 192 の場合) または継続バイトの。マルチバイト シーケンスの最初のバイトの後に継続バイトが続かない場合、またはシーケンスが継続バイトで始まる場合、認識されないバイト シーケンス (この場合はU+FFFD codepoint ) を取得します。ISO-8859-n では、分音記号を含むすべての文字は 128 を超えています。

encoding に関する swi-prolog のマニュアル ページ、特に次の 2 つの文で始まる段落全体も確認してください。

ファイルのデフォルトのエンコーディングは、環境から初期化される Prolog フラグから派生し encodingます。環境変数 LANG が「UTF-8」で終わる場合、このエンコーディングが想定されます。

シェルまたは PHP 内から呼び出されたときに swi-prolog の動作が異なる正当な理由は、LANGこれら 2 つのケースで環境変数の設定が異なる可能性があります。しかし、同じ段落で、マニュアルはエンコーディングを強制する方法について言及しています。

シェルで、ファイルに含まれるバイトを確認する最も速い方法は、od -tx1z filename | less(印刷しにくい文字の場合は z を省略します) を実行することです。

于 2012-07-05T20:23:55.197 に答える