Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    ajax ed encoding dei caratteri iso-latin1

    ciao maestri ...

    allora vi spiego il mio problema; ha a che fare essenzialmente con due cose: ajax e codifica dei caratteri.

    allo9ra ho un db latin-1 contenente nomi di città. Esse sono città europee e sono formate da caratteri dell'encoding latin-1. Ci sono città come "paris", "london" e (usando caratteri un pò più strani) città come "Gänserndorf"!

    nell'applicazione che sto facendo c'è un campo di ricerca ajax sui nomi delle città. Nella fattispecie se io digito "Gänserndorf" nel campo di ricerca non ottengo alcun risultato anche se la città è presente nel db. mi viene da pensare che ajax passi in modo errato la lettera ä e che php , di conseguenza, non riesca a fare il match tra il nome della città presente nel db e il nome inserito nel form ajax.

    che il problema sia sicuramente questo lo testimonia il fatto che se cerco citta come "london" (composte di caratteri ascii semplice) non ho problemi e tutto funziona perfettamente.

    come faccio???

  2. #2

    Re: ajax ed encoding dei caratteri iso-latin1

    Per far dialogare in modo corretto client-server devi usare la codifica UTF-8.
    Per codificare le stringhe lato client la funzione migliore (l'unica che codifichi in modo completo tutti i caratteri per lo scopo) è encodeURIComponent

    Vedrai che in quel modo risolvi.
    Ti consiglio la lettura di questo paragrafo per diventare esperto del problema in pochi minuti.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  3. #3
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    grazie .. ci do una letta e ti faccio sapere se ho alòtri problemi

  4. #4
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    ok letto l'articolo

    il grande Giammarchi e sempre il grande Giammarchi!

    quello che adesso non capisco è la seguente cosa: se javascript lavora in unicode e PHP no (non di default) perche mai quando php restituisce a javascript (via ajax) caratteri della codifica iso-latin, il javascript non li visualizza correttamente?

    insomma perche mail devo usare utf8_encode prima di restituire i dati ad ajax se javascript lavora in unicode e unicode è un sovrainsime di latin1??? unicode non è un'estensione (un sottoinsieme) di unicode?

    in altre parole ci sono caratteri che in latin1 sono codificati in modo diverso da quello usato nell'unicode?

    love you all

  5. #5
    Sui charset devo ancora studiare un po', però sono quasi sicuro che Unicode contenga UTF-8.

    Tuttavia UTF-8 non può rappresentare in un solo byte tutti i caratteri del set Latin-1, ma non credo che questo costituisca un problema perché dopo aver decodificato la stringa da Latin-1 a UTF-8 e averla inviata e ricevuta dal client in Unicode, non ci sono errori di decodifica.

    Praticamente i set di base utilizzano un solo byte per ogni carattere, ma in questo modo hanno (ovviamente) delle possibilità limitate di combinazioni, per cui rappresentano solo un certo numero di caratteri (il charset, appunto).
    Quando un carattere non è contenuto in quel set, lo rappresentano usando 2 byte (multibyte), cosa che nella realtà vedi fisicamente come 2 caratteri (spesso non molto belli o comprensibili), però l'informazione viene mantenuta.
    Per questo quando il client riceve i caratteri decodificati in multibyte è in grado di risalire al carattere originario.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  6. #6
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    si mail dubbio che mi resta è:

    è OGNI caratteri iso-8859-1 codificato nello stesso modo anche in utf-8??

    mi sembra logico pensare di si visto che utf-8 estende le codifche iso. per altro non ne posso esserne certo ed è per questo che chiedo ...

    in effetti se cosi fosse (iso sottoinsieme di utf-8) non ci dovrebbero essere problemi a offrire una stringa iso-8859-1 (mandata da php) ad ajax. visto che javascript è unicode dovrebbe essere in grado di interpretare correttamente anche iso. ma sempre e solo nell'ipotesi che iso sia un sottoinsieme di unicode.

    mi è infatti successo di spedire a javascript delle stringhe iso-8859-1 che venivano male codificate nel browser ... il che mi fa pensare che la mia domanda di partenza (è OGNI caratteri iso-8859-1 codificato nello stesso modo anche in utf-8) si merito un secco NO!

    devo studiarmele ste robe ... è che non ho tempo


    ciao

  7. #7
    Originariamente inviato da nourdine
    si mail dubbio che mi resta è:

    è OGNI caratteri iso-8859-1 codificato nello stesso modo anche in utf-8??

    mi sembra logico pensare di si visto che utf-8 estende le codifche iso. per altro non ne posso esserne certo ed è per questo che chiedo ...

    in effetti se cosi fosse (iso sottoinsieme di utf-8) non ci dovrebbero essere problemi a offrire una stringa iso-8859-1 (mandata da php) ad ajax. visto che javascript è unicode dovrebbe essere in grado di interpretare correttamente anche iso. ma sempre e solo nell'ipotesi che iso sia un sottoinsieme di unicode.

    mi è infatti successo di spedire a javascript delle stringhe iso-8859-1 che venivano male codificate nel browser ... il che mi fa pensare che la mia domanda di partenza (è OGNI caratteri iso-8859-1 codificato nello stesso modo anche in utf-8) si merito un secco NO!

    devo studiarmele ste robe ... è che non ho tempo


    ciao
    Infatti no, tutti i caratteri iso-8859-1 non hanno corrispondenza con tutti i caratteri UTF-8.
    Ma tu di questo non devi preoccuparti per quello che ti ho spiegato: la codifica in UTF-8 di un carattere non facente parte del charset UTF-8 viene fatta in 2 byte, che poi UNICODE può tranquillamente interpretare.
    Tu però non vedi per niente quel passaggio, perché passi all'utf8_decode() le stringhe solo prima di restituirle a JavaScript.

    In pratica:
    Codice PHP:

    <?php
    // stampo la stringa da inviare a JavaScript:
    $string "àèéìòù@ç#§£$%&";
    echo 
    utf8_encode($string);
    ?>
    Anche se quella stringa da 14 caratteri trasformata in UTF-8 venisse trasformata in modo astruso e illeggibile (codifica di un carattere in più byte) Ajax la leggerà in UNICODE decodificando correttamente la tua stringa.

    Al contrario per inviare stringhe da JavaScript a PHP:

    codice:
    <script type="text/javascript">
    <!--
    
    function ajaxblabla() {
         var msg = "àèéìòù etc...";
         
         // tuo codice per la chiamata asincrona...
         
         xmlHttp.open("GET", "slavePage.php?msg=" + encodeURIComponent(msg), true);
         xmlHttp.send(null);
    
         // blablabla...
    }
    
    //-->
    </script>

    Il fatto è che normalmente una pagina che invia i dati ad Ajax non viene aperta in altri modi o inclusa in altri script lato server per essere stampata a schermo, quindi la codifica intermedia in utf-8 non deve essere vista e non costituisce un problema.
    Spero di aver risposto al tuo quesito.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  8. #8
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    si ci siamo abbastanza! la risposta fondaemntale èp stata:

    Infatti no, tutti i caratteri iso-8859-1 non hanno corrispondenza con tutti i caratteri UTF-8.

    io ero convinto di si anche se avevo prove empiriche del contrario! quindi ho capito che bisogna sempre usare utf8_encode quando si passa da php ad ajax.

    ora però non capisco il senso di encodeURIComponent()

    in che codifica trasforma il suo argomento???

  9. #9
    Originariamente inviato da nourdine
    si ci siamo abbastanza! la risposta fondaemntale èp stata:

    Infatti no, tutti i caratteri iso-8859-1 non hanno corrispondenza con tutti i caratteri UTF-8.

    io ero convinto di si anche se avevo prove empiriche del contrario! quindi ho capito che bisogna sempre usare utf8_encode quando si passa da php ad ajax.

    ora però non capisco il senso di encodeURIComponent()

    in che codifica trasforma il suo argomento???
    Quando con Ajax invii dati via GET, è chiaro che la query string debba essere codificata per essere adatta al trasferimento via URL, ovvero URLencoded.
    L'URLencoding prevede la trasformazione dei caratteri speciali con il simbolo "%" seguito dal codice esadecimale corrispondente al carattere (se conosci PHP avrai avuto a che fare con la funzione urlencode($string)).

    Una funzione che in JavaScript si avvicina a URLencode è escape(), a lungo utilizzata per questo scopo ma erroneamente, poiché non è in grado di codificare in modo standard o comprensibile tutti i caratteri definiti da UNICODE.

    La codifica più adatta, per inviare, ricevere o leggere caratteri è la UTF-8.
    Per essere quindi certi che non ci saranno problemi di comunicazione tra le stringhe JavaScript ed il linguaggio server-side è sempre consigliabile sfruttare questa codifica.

    L'unica funzione di JavaScript in grado di convertire correttamente le stringhe in UTF-8 è la funzione encodeURIComponent.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  10. #10
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    quindi fammi capire:

    l'encoding UTF-8, che qui ci garantiamo con encodeURIComponent(), viene di solito fatto automaticamente dal browser quando inviamo dati in GET usando un classico form.

    Ecco spiegato perchè nella querystring di un invio di dati "vecchio stile" (via form) ci sono sempre un sacco di caratteri strani!!

    dico bene?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.