Newsgroup: it.comp.www.php
Titolo: xml e codifica uft (vorrei iso)

Salve a tutti.
Ho un problema con la codifica dei file xml e php 4.+.
la funzione domxml_open_file mi legge il file e mantiene in memoria dati 
con codifica uft8 anziche ISO-8859-1.
mi spiego meglio.ecco uno script d'esempio
prima cosa vorrei pero!
vorrei non passare per le mie imperfette e bucabilissime funzioni encode 
e decode. se uno dalla francia mi mette una lettera con accento 
circonflesso mi sballa tutto. insomma io ho codificato cosa ho in 
tastiera e non cosa non ho!
1)nomi.xml salvare e dare i permessi in scrittura
<?xml version="1.0"?>
<Nomi>
</Nomi>
ecco lo script. stessa directory xml (xml da settare scrivibile).
prima cliccare sul
passo 3 in modo da inserire correttamente
poi passo 1 (query corretta)
poi passo 2 (query che non funziona)
poi passo 4 (inserimento non funzionante)
che dire. se ne avete proprio voglia grazie.
2)script
<?php
////////////////////////////////INIZIO SCRIPT//////////////////////////////
//funzioni
////////////////////////////////ARRAY//////////////////////////////////////
function dump($valore)
{
     echo "<pre>";
     print_r($valore);
     echo "</pre>";
}
function getStruct(&$dati,$numero_colonne,$numero_risultati,$chiave)
{
         $struct = array();$str_array=array();$numero_campi = 0;
         //dump($dati);
         for($x=0;$x<=count($dati->nodeset)-1;$x++)
         {
             if($dati->nodeset[$x]->type==1)$numero_campi++;
         }
         $numero_record = $numero_campi/$numero_colonne;
         $campo = 0;
         $indice_riga = 0;
         $str_array[$indice_riga] = null;
         for($x=0;$x<=count($dati->nodeset)-1;$x++)
         {
             if($dati->nodeset[$x]->type==1)
             {
                 if($campo==($numero_colonne))
                 {
                     $campo = 0;
                     $indice_riga++;
                     $str_array[$indice_riga] = null;
                 }
                 $campo++;
                 if($campo == 1 && $dati->nodeset[$x]->tagname()!=$chiave)
                 return array("Bug Algoritmo XML -> DAO. Giro ".$x." sul 
tag:".$dati->nodeset[$x]->tagname() );
                 else
                 $str_array[$indice_riga] .= "'". 
$dati->nodeset[$x]->tagname() ."'". "=>" . "'". 
Uft8_decode($dati->nodeset[$x]->get_content())."',";
                 }
         }//die();
             for($x=0;$x<=count($str_array)-1;$x++)
                 {
                  eval('$struct['.$x.'] = 
array('.substr($str_array[$x],0,strlen($str_array[$x])-1).');');
                 }
            if($numero_risultati==1)
             return $struct[0];
         else
             return $struct;
}
function Uft8_decode($stringa)
{
         $str_temp = null;
         for($x=0;$x<=strlen($stringa);$x++)
         {
             switch(ord(substr($stringa,$x,1)))
             {
             case 194:
                 if(ord(substr($stringa,$x+1,1))==128)//?
                 {
                     $str_temp .= chr(128);
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==167)//?
                 {
                     $str_temp .= chr(167);
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==163)//?
                 {
                     $str_temp .= chr(163);
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==176)//?
                 {
                     $str_temp .= chr(176);
                     $x++;
                 }
             break;
             case 195:
                 if(ord(substr($stringa,$x+1,1))==160)//à
                 {
                     $str_temp .= "à";
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==167)//è
                 {
                     $str_temp .= "ç";
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==168)//è
                 {
                     $str_temp .= "è";
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==169)//é
                 {
                     $str_temp .= "é";
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==185)//ù
                 {
                     $str_temp .= "ù";
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==172)//ì
                 {
                     $str_temp .= "ì";
                     $x++;
                 }
                 if(ord(substr($stringa,$x+1,1))==178)//ò
                 {
                     $str_temp .= "ò";
                     $x++;
                 }
             break;
             default:
                 $str_temp .= substr($stringa,$x,1);
             break;
             }
         }
         return $str_temp;
}
function Uft8_encode($stringa)
{
         $str_temp = null;
         for($x=0;$x<=strlen($stringa);$x++)
         {
             switch(ord(substr($stringa,$x,1)))
             {
             case 167://§
                     $str_temp .= chr(194).chr(167);
             break;
             case 163://£
                     $str_temp .= chr(194).chr(163);
             break;
             case 176://°
                     $str_temp .= chr(194).chr(176);
             break;
             case 231://ç
                     $str_temp .= chr(195).chr(167);
             break;
             case 233://é
                     $str_temp .= chr(195).chr(169);
             break;
             case 224://à
                     $str_temp .= chr(195).chr(160);
             break;
             case 232://è
                     $str_temp .= chr(195).chr(168);
             break;
             case 242://ò
                     $str_temp .= chr(195).chr(178);
             break;
             case 236://ì
                     $str_temp .= chr(195).chr(172);
             break;
             case 249://ù
                     $str_temp .= chr(195).chr(185);
             break;
             case 128://?
                     $str_temp .= chr(194).chr(128);
             break;
             default:
                 $str_temp .= substr($stringa,$x,1);
             break;
             }
         }
         return $str_temp;
}
function insertRecordXML($nome_tabella,$interfaccia,$params)
{
         $domDoc = domxml_open_file("nomi.xml");
            $nodoRoot = $domDoc->first_child();
           $nodi_level2 = $nodoRoot->child_nodes();
           $nodo = $domDoc->create_element($nome_tabella.'-row');
           $riga = $nodoRoot->append_child( $nodo );
           //print_r($interfaccia);die();
           for($x=0;$x<=count($interfaccia)-1;$x++)
           {
               eval('$nodo = 
$domDoc->create_element($interfaccia['.$x.']);');
               //die();
               $nodo_campo = $riga->append_child($nodo);
                $testo_nodo = 
$domDoc->create_text_node(htmlspecialchars(addslashes(Uft8_encode($params[$x]))));
                $nodo_campo->append_child($testo_nodo);
            }
            $domDoc->dump_file("nomi.xml",false,true);
}
function insertRecordXMLNONISO($nome_tabella,$interfaccia,$params)
{
         $domDoc = domxml_open_file("nomi.xml");
            $nodoRoot = $domDoc->first_child();
           $nodi_level2 = $nodoRoot->child_nodes();
           $nodo = $domDoc->create_element($nome_tabella.'-row');
           $riga = $nodoRoot->append_child( $nodo );
           //print_r($interfaccia);die();
           for($x=0;$x<=count($interfaccia)-1;$x++)
           {
               eval('$nodo = 
$domDoc->create_element($interfaccia['.$x.']);');
               //die();
               $nodo_campo = $riga->append_child($nodo);
                $testo_nodo = 
$domDoc->create_text_node(htmlspecialchars(addslashes(($params[$x]))));
                $nodo_campo->append_child($testo_nodo);
            }
            $domDoc->dump_file("nomi.xml",false,true);
}
function selectXML(&$dom,$query){
            $calcX = $dom->xpath_new_context();
            $dati = $calcX->xpath_eval($query);
            return $dati;
}
//recupero il dato e purtroppo lo codifico in uf8 (poi vi posto come)
error_reporting(E_ALL);
$query = null;
$query2 = null;
$nome2 = null;
$nome = null;
if(count($_POST)>0)
{
   $nome = Uft8_encode($_POST["nome"]);
   $query = "//Nomi-row[Nomi_Nome = '".$nome."']/child::node()";
   $nome2 = $_POST["nome"];
   $query2 = "//Nomi-row[Nomi_Nome = '".$nome2."']/child::node()";
}
if(count($_POST)>0 && $_POST['azione'] == 'leggi')
{
  $dom = domxml_open_file("nomi.xml");
  $select_dom = selectXML(&$dom,$query); //mia funzione
  $array_ass = getStruct(&$select_dom,3,0,"Nome_ID"); // mia funzione
  dump($array_ass);
}
if(count($_POST)>0 && $_POST['azione'] == 'leggiISO')
{
  $dom = domxml_open_file("nomi.xml");
  $select_dom = selectXML(&$dom,$query2); //mia funzione
  $array_ass = getStruct(&$select_dom,3,0,"Nome_ID"); // mia funzione
  dump($array_ass);
}
if(count($_POST)>0 && $_POST['azione'] == 'inserisci')
{
  $dati = array("1",$_POST["nome"],"");
  $struttura_xml = array("Nome_ID","Nomi_Nome","Nomi_Cognome");
  $nome_tabella = "Nomi";
  insertRecordXML($nome_tabella,$struttura_xml,$dati);
}
if(count($_POST)>0 && $_POST['azione'] == 'inserisciISO')
{
  $dati = array("1",$_POST["nome"],"");
  $struttura_xml = array("Nome_ID","Nomi_Nome","Nomi_Cognome");
  $nome_tabella = "Nomi";
  insertRecordXMLNONISO($nome_tabella,$struttura_xml,$dati);
}
?>
<p>Questa è la stringa per il test del problema: 
òàùèì|!£$%/()=?^*§°ç:;,.-+</p>
<p>Tralascio ' " e & e \ per problemi che non riguardano la codifica</p>
<fieldset>
<legend>problema query</legend>
<p>se non passo il valore dalla mia funzione encode la ricerca non funge</p>
<p>Query: <?echo $query?></p>
<form method="post">
<input type="text" name="nome" value="òàùèì|!£$%/()=?^*§°ç:;,.-+" size="40">
<input type="text" name="azione" value="leggi">
<input type="submit">
</form>
</fieldset>
<fieldset>
<legend>problema query</legend>
<p>LETTURA SENZA ENCODE: NON FUNZIONA</p>
<p>Query: <?echo $query2?></p>
<form method="post">
<input type="text" name="nome" value="òàùèì|!£$%/()=?^*§°ç:;,.-+" size="40">
<input type="text" name="azione" value="leggiISO">
<input type="submit">
</form>
</fieldset>
<fieldset>
<p>Qui il problema è più grave. se non passo i valori dalla funzione 
Uft8_encode (vedi riga 134) il file xml viene corrotto</p>
<legend>problema modifica (inserimento)</legend>
<form method="post">
<input type="text" name="nome" value="òàùèì|!£$%/()=?^*§°ç:;,.-+" size="40">
<input type="text" name="azione" value="inserisci">
<input type="submit">
</form>
</fieldset>
<fieldset>
<p>ECCO COME VIENE CORROTTO</p>
<legend>problema modifica (inserimento)</legend>
<form method="post">
<input type="text" name="nome" value="òàùèì|!£$%/()=?^*§°ç:;,.-+" size="40">
<input type="text" name="azione" value="inserisciISO">
<input type="submit">
</form>
</fieldset>
<?php
////////////////////////////////FINE SCRIPT//////////////////////////////
?>
-- 
Massimiliano Balestrieri
in...@maxb.net
http://www.maxb.net

max...@tiscali.it
 ha scritto:
risolto!
basta dire quali sono i caratteri leciti.
tutti gli altri vanno a inserire un errore nel message-stack
saluti
