Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    Multibyte String Functions overload ...

    Ciao.
    Cosa utilizzate, per evitare
    problemi nella gestione delle
    stringhe con codifica utf-8

    Ho pensato a questa semplice
    funzione:
    Codice PHP:
    function mb_($func/*[, mixed args ]*/){
        
    $args func_get_args();
        
    array_shift($args);
        
    $overload'mb_'.$func;
        if(
    function_exists($overload)){
            return 
    call_user_func_array($overload,$args);    
        }
        return 
    call_user_func_array($func,$args);
    }
    var_dump(mb_('substr','php',0,2)); 
    Che ne pensate ?

    Ho letto che l'overload può essere
    settato ad esempio in un file .htaccess
    tipo
    php_value mbstring.func_overload 7

    ma
    http://bugs.php.net/bug.php?id=27421




    insomma che cosa utilizzate ?



    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  2. #2
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao,
    io piuttosto ti consiglierei di crearti una classe, anche se quello che scrivi funziona non mi sembra aiutare molto allo scopo di mantenere il codice semplice e leggibile.
    Ciao

  3. #3
    Più che una classe, forse sarebbe più efficace creare due file con le definizione di tutte le funzioni supportate da mb. In un file richiami direttamente le funzioni mb_*, nell'altro richiami quelle standard. All'inizio dello script, a seconda della configurazione, includi uno o l'altro file.

    In questo modo l'overhead introdotto è minimo e permetti a PHP (ed eventualmente ad un acceleratore) di ottimizzare il codice più velocemente.

    Inoltre, come ha scritto Razorblade, rendi il codice più leggibile.

    Invece di:

    Codice PHP:
    mb_('substr','php',0,2); 
    avresti una cosa tipo:

    Codice PHP:
    substr_('php'02); 

  4. #4
    Grazie dei suggerimenti.
    @Razorblade
    Fare una classe apposita
    penso risolva poco la cosa
    anzi ad un primo pensiero la
    complica ..............

    @filippo.toso
    La soluzione mi sembra buona
    anche se un po dispersiva
    sono un vagabondo


    Mah sarà che è figlia
    mia ma la funzione non mi
    sembrava male


    Altre idee .................


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  5. #5
    in generale, se non hai necessità particolari, non hai bisogno delle mb.

    Considera che le normali funzioni non è che non lavorano, funzionano perfettamente, ma ovviamente bisogna usarle con attenzione. E normale che se lanci un strtolower, ucfirst, ucwords, strtoupper e simili incenerisci nel modo più totale tutto, ma se fai attenzione a quello che usi, di norma, non hai necessità di usare quelle funzioni.

    Io, sinceramente, mi sono fatto un set di classi raggruppate sotto un elemento parent che ho chiamato I18N (come si chiamano di norma queste funzioni) che mi sfrutta le funzioni disponibili di php per fare le operazioni, per fare un esempio su strtoupper:
    - se c'è usa mb_strtoupper
    - alternativamente usa le iconv (per le funzioni disponibili)
    - in estremis usa un bell'utf8_decode e poi re-encoda che è una soluzione ASSOLUTAMENTE orrenda ma è l'ultima disponibile

    In realtà ho iniziato a lavoricchiare su un set di funzioni che supportano l'utf8 e mimano il funzionamento delle mb cosi da usarle se ci sono o, in caso di mancanza, sfruttare il proprio sistema di riconoscimento degli UTF8. Riconoscere un carattere utf8 è abbastanza semplice: se N bit sono 1 vuol dire che quel byte non è un carattere ma è un pezzo di un carattere e cosi via dicendo fino a 4 byte. Con questo semplice giochino si evita di distruggere il tutto.

  6. #6
    Originariamente inviato da daniele_dll
    in generale, se non hai necessità particolari, non hai bisogno delle mb.

    Considera che le normali funzioni non è che non lavorano, funzionano perfettamente, ma ovviamente bisogna usarle con attenzione. E normale che se lanci un strtolower, ucfirst, ucwords, strtoupper e simili incenerisci nel modo più totale tutto, ma se fai attenzione a quello che usi, di norma, non hai necessità di usare quelle funzioni.

    Io, sinceramente, mi sono fatto un set di classi raggruppate sotto un elemento parent che ho chiamato I18N (come si chiamano di norma queste funzioni) che mi sfrutta le funzioni disponibili di php per fare le operazioni, per fare un esempio su strtoupper:
    - se c'è usa mb_strtoupper
    - alternativamente usa le iconv (per le funzioni disponibili)
    - in estremis usa un bell'utf8_decode e poi re-encoda che è una soluzione ASSOLUTAMENTE orrenda ma è l'ultima disponibile

    In realtà ho iniziato a lavoricchiare su un set di funzioni che supportano l'utf8 e mimano il funzionamento delle mb cosi da usarle se ci sono o, in caso di mancanza, sfruttare il proprio sistema di riconoscimento degli UTF8. Riconoscere un carattere utf8 è abbastanza semplice: se N bit sono 1 vuol dire che quel byte non è un carattere ma è un pezzo di un carattere e cosi via dicendo fino a 4 byte. Con questo semplice giochino si evita di distruggere il tutto.
    grazie dell'approfondimento


    - in estremis usa un bell'utf8_decode e poi re-encoda che è una soluzione ASSOLUTAMENTE orrenda ma è l'ultima disponibile
    e si era venuta anche a me questa idea
    che tra l'altro è quella adottata da
    http://konstrukt.dk/
    per adesso


    Per fare il punto

    E normale che se lanci un strtolower, ucfirst, ucwords, strtoupper e simili incenerisci nel modo più totale tutto, ma se fai attenzione a quello che usi, di norma, non hai necessità di usare quelle funzioni.
    questo è riferito all'input dell'user
    e spero almeno secondo me
    che non infici il codice interno.

    Esempio.

    Codice PHP:
    function autoload($classname) {      $filename str_replace('_''/'strtolower($classname)).'.php';     /*  do stuff  */    
    o sbaglio ?




    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  7. #7
    nono assolutamente, il problema è proprio dovuto al fatto che php utilizza una codifica a singolo byte internamente

    per intenderci, altri linguaggi come il .NET tengono in memoria le stringhe in formato variabile, di default in formato UNICODE (o UTF8 non ricordo), poi fa le varie conversioni per come gli serve

  8. #8
    Originariamente inviato da daniele_dll
    nono assolutamente, il problema è proprio dovuto al fatto che php utilizza una codifica a singolo byte internamente

    per intenderci, altri linguaggi come il .NET tengono in memoria le stringhe in formato variabile, di default in formato UNICODE (o UTF8 non ricordo), poi fa le varie conversioni per come gli serve
    Provo a tradurre ......

    Se prendo il codice postato
    lo incollo in un file
    salvo il file in UTF-8

    PHP va in confusione
    VVoVe: su una funzione su cui
    è basato tutto il framework


    just waiting ........
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  9. #9
    Originariamente inviato da daniele_dll
    altri linguaggi come il .NET
    intendi C#

  10. #10
    @whisher:
    beh, se lo salvi in utf8 l'unica differenza che ottieni è che i caratteri "speciali" (vedi le accentate o altri che sono multi-byte su utf8) saranno multibyte sul disco e non essendo gestiti da php te li trovi come due caratteri separati

    ergo

    se fai

    <?php

    echo "à";

    ?>

    e salvi in utf8 ti ritrovi 2 simboli/caratteri ben distinti

    nota: per fare tutto ciò devi anche inviare un header che forzi il charset su latin1 (ergo iso-xxxx-1) altrimenti il browser tenta di capire da solo cos'è e te lo mostra come utf8

    nel codice hai scritto, non gli frega un granché

    PS: di solito evito di salvare i file di php in utf8 perché si rischia di far confusione con operazioni di replace o simili perché quelli che scrivi potrebbe non corrispondere esattamente a quello che salvi

    @paiola:
    no, qualsiasi linguaggio basato sul .NET ... è la macchina virtuale che se ne occupa, anche se comunque si può aggirare la cosa gestendolo manualmente (non ha molto senso)

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.