2012-07-05 31 views
0

我在swi-prolog和php之間創建了一個接口。 PHP編寫命令,它希望prolog在文件上運行,然後執行系統調用,以便prolog運行該文件。問題是,當文件上有特殊字符(如á,í,ê,ê等等)時,這些字符在prolog的輸出中被替換爲\ uFFFD,我知道這個代碼點是unknown/unidentified codepoints,但是我一直沒有成功解決我在互聯網上發現的問題。如果從終端自己運行文件,它會顯示正確的字符,只是當php從exec或shell_exec運行時,它似乎失去了原因。Prolog和php編碼

這裏的使用的代碼,第一個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. 

是否有人知道如何使它正確地解釋串?

+1

除了您必須在變量中轉義引號這一事實之外,您正在談論的字符在哪裏進入場景?你是否檢查過所有的編碼匹配(終端,IDE等)? – 2012-07-05 20:12:51

回答

0

很可能Prolog期望UTF-8編碼的字符,並且您正在餵它ISO-8859-n個字符,其中n最可能是1或15.在UTF-8中,當看到字節> = 128時,它或者是第一個多字節序列(如果它是> = 192)或一個連續字節。如果多字節序列的第一個字節沒有跟隨一個連續字節,或者如果一個序列以一個連續字節開始,則會得到一個無法識別的字節序列,在你的情況下爲U+FFFD codepoint。在ISO-8859-n中,所有帶變音符號的字符均大於128。

檢查也swi-prolog's manual page on encoding,特別是全款,與這兩句話開始:

文件的默認編碼從Prolog的標誌 encoding,這是從環境中初始化的。如果 環境變量LANG以「UTF-8」結尾,則假定此編碼。

從shell或PHP內部調用swi-prolog的不同行爲的一個很好的原因可能是這兩種情況下LANG環境變量的不同設置。但在同一段中手冊提到了強制編碼的方法。

在shell中,查看文件中包含的字節的最快方法是執行od -tx1z filename | less(在難以打印字符的情況下,不要使用z)。