Visualizzazione dei risultati da 1 a 9 su 9

Discussione: scrivere file utf-8

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074

    scrivere file utf-8

    Ciao a tutti,
    ho un problema che riguarda un sito in Flash, ma la difficoltà nasce nel php - quindi posto qui.
    Mi spiego:
    il mio file Flash carica, on-demand, del testo da file .txt, che vengono creati al volo da php, al caricamento della pagina. Questa funzione è necessaria, perchè i testi - che sono registrati su database - possono essere modificati anche di frequente dagli amministratori.
    Il problema si pone con la codifica dei file txt; perchè le lettere accentate e gli apostrofi siano letti correttamente da Flash, i file devono essere con codifica unicode/utf-8, ed in effetti i file che originariamente metto sul server sono con questa codifica. Però, quando php ne riscrive il contenuto, al caricamento della pagina, evidentemente salva il file con una codifica differente, perchè Flash non vede più i caratteri accentati.
    In effetti, se carico nel browser di testo il file .txt, mi mostra le accentate; però Flash no, e se faccio il download del file .txt, verifico che non è più utf-8.
    Nel database, i caratteri appaiono correttamente: la collation è latin1_swedish_ci, il database usa il set di caratteri MySQL: UTF-8 Unicode (utf8), la collazione della connessione di MySQL è utf8_general_ci.
    Per scrivere il file .txt, uso la funzione:
    Codice PHP:
    $azit "testo=" $azit;
    $newfile fopen("aziendait.txt""w");
    fwrite($newfile$azit);
    fclose($newfile); 
    Come posso risolvere?
    metatad
    graphic & web design

  2. #2

  3. #3
    Mmmm, credo (credo!) che la collation del database su latin possa creare l'incompatibilità.

    Non credo che impostare la connessione al DB su UTF8 sia sufficiente a trasformare magicamente tutti i caratteri da un charset all'altro.

    Dovresti fare una prova con un db con collation UTF8 con dati in UTF8 e provare ad estrapolarli da lì.

    Oppure trovare il modo di gestire le stringhe in UTF8 da flash, se il problema è nella lettura da flash e non nella creazione del file txt.

    Non ho capito se però i file .txt sono preesistenti (dici che sono già presenti in UTF8) o se li crei tu tramite i dati che tiri fuori dal database (e allora il problema potrebbe facilmente essere nella scrittura del file e quindi segui la risposta di filippo).

    La variabile $azit con che contenuto è inizializzata? Da dove viene preso il testo?

    Ricordati che PHP non gestisce nativamente UTF8, quindi devi fare qualcosa tu (con mbstring se l'hai disponibile sul tuo server in produzione) per gestire eventuali caratteri più lunghi di un byte.

    DISCLAIMER: ovviamente tutto detto da ignorantone sull'argomento

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    perfetto, e molto interessante, però mi risolve solo a metà...
    Ho provato sia così:
    Codice PHP:
    $newfile fopen("aziendait.txt""w");
    fwrite($newfile,utf8_encode($azit));
    fclose($newfile); 
    sia così:
    Codice PHP:
    $f=fopen("aziendait.txt""wb"); 
    $azit=utf8_encode($azit); 
    $azit="\xEF\xBB\xBF".$azit
    fputs($f$azit); 
    fclose($f); 
    basandomi sulle indicazioni presenti nelle note. Però, con entrambe le soluzioni, ottengo di leggere le accentate, ma non gli apostrofi (al posto dei quali viene visualizzato una A maiuscola accentata, racchiusa in un quadratino...).
    Da cosa può dipendere?
    E come risolvere?

    metatad
    graphic & web design

  5. #5
    Prova a crearti un db copia del tuo con le tabelle base per eseguire la query di estrazione dati che ti serve per scrivere il file (se appunto come mi pare di capire i dati provengono da una query al db).
    Reinseriscici un paio di righe di dati di prova e guarda se anche lì il problema ti si risolve.

    Ovviamente (non ho specificato) il db copia dev'essere in UTF8 (con i dati reinseriti nuovamente in UTF8. Una semplice conversione di collation del db non risolverebbe).

    Quello già ti può dare delle indicazioni sul problema.

    Mi viene un dubbio strano (e visto che non lavori completamente in utf8 mi sorge il dubbio che si possano creare delle beghe): non è che il testo che hai contiene quegli strani apostrofi "all'americana" e non il carattere apostrofo che ti aspetti tu?
    E quindi che il carattere apostrofo sia già 'fuori posto' (leggi: codifica errata) durante la memorizzazione nel db (o magari sono apostrofi leggibili in UTF-8, magari copiaincollati da altri software, e trasformati malamente in Latin).

    E' un ragionamento un pò contorto ma se ti riscrivi quei dati a mano nel db scrivendo l'apice che hai TU sulla tastiera ti dà lo stesso problema.

    Secondo me quell'apice non è lo stesso esatto carattere che tu chiami apice. Oppure è in una codifica diversa dal resto del testo.

    Le solite ipotesi a caso.... però magari controlla

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    Ok, avevi ragione... come spesso succede, il problema è banale e dietro l'angolo, però non si vede...
    In effetti, erano gli apostrofi ad essere in un'altra codifica...
    Però... come posso fare ad evitare questo problema, considerando che sono gli amministratori del sito ad aggiornare i contenuti del db, e che - per quanto gli abbia detto di non utilizzare Word - è sempre possibile che facciano vari copia-e-incolla, incorporando quindi anche questi apostrofi strani?
    C'è modo di identificarli, e quindi procedere con uno str_replace?

    metatad
    graphic & web design

  7. #7

  8. #8
    Vedi sopra.

    Oppure se vuoi fare da te semplicemente puoi farti restituire il codice di quel carattere (con ord()) e poi prima di effettuare l'inserimento applichi una funzione fatta da te che controlla la stringa alla ricerca di quel carattere (che ricostruisci con chr()) e lo sostituisce con un apice a tua scelta (ovviamente compatibile con la codifica che hai... latin o utf8 a seconda di come hai il database [credo!]).

    Trovato il problema scegli (o inventa!) tu la soluzione con cui ti trovi meglio

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    ok, grazie a tutti x i consigli preziosi...

    metatad
    graphic & web design

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.