[PHP] fwrite problema con le parole accentate

  • Creatore Discussione Creatore Discussione Cosina
  • Data di inizio Data di inizio

Cosina

Utente Attivo
27 Dic 2016
101
0
16
Buongiorno. Si tratta di un semplice modulo per i commenti. Il testo dei commenti, inviato tramite un form, viene archiviato nel file comments.html. Il problema sono le parole accentate che creano simboli di errore (come questi è Ã) che aumentano fino a creare lunghe file ad ogni accesso al file comments.html. Come posso rimediare? Grazie per l'aiuto.
Il codice è questo:

PHP:
if ($_POST){
$name = $_POST['name'];
$date = new DateTime();
$date = $date->format("d.m.y - h:i:s");
$content = $_POST['message'];
$handle = fopen("comments.html","a");
fwrite ($handle
,"<p><span style='color:red; background-color:transparent; font-weight:bold; font-size:12pt;'>" . $name . "</span><br>"
. $date . "<br><em>"
. $content . "</em></p><hr>\r\n");
fclose ($handle);
header("location: ./comments-form.html");
}
?>
 
Grazie, ma non mi aiuta. Non sono un'esperta di php e i miei siti sono in html5. Uso php solo per i moduli e senza database. Qualunque soluzione ho necessita` che sia nel codice php che ho postato. Se esiste, vi sarei grata di volermela mostrare nella pratica. Scusate per i miei limiti
 
Aggiornamento: ho provato ad aggiungere questa regola: $content = utf8_decode($_POST['message']);. Ora le lettere accentate vengono trascritte in modo corretto nel file comments.html, ma ho un altro problema. Per visualizzare l'anteprima dei commenti in una pagina html del sito utilizzo un include con jQuery. Adesso sono le accentate nell'include che non si vedono. Al loro posto vedo questo simbolo: �. Qualche idea? Nella pagina html che ospita l'include c'e` il metatag <meta charset="utf-8">
 
Leggendo un po' in giro, forse bisognerebbe sostituire le lettere accentate con le rispettive entity (&egrave; &eacute; ), ma io non so come fare. Ho trovato diverse spiegazioni, ma non essendo pratica, non so implementarle. Spero che possiate aiutarmi. Grazie
 
Per usare le entity fai cisì!
esempio:
HTML:
Non è vero che può essere più bello
Con entity
Non &egrave; vero che pu&ograve; essere pi&ugrave; bello
Ma sono convinto che se usi correttamente l'utf-8 risolvi il problema
 
Ti ringrazio per la risposta Max 1, ma non mi sono spiegata bene. So come usare le entity, anche perche` fa parte del mio mestiere, dato che sviluppo siti web in html5. Quello che non sono in grado di fare, non essendo esperta di php, e` implementare un codice che automaticamente trasformi in entity le lettere accentate contenute nel testo dei commenti prima che venga inviato al file comments.html. Ho inserito l'utf-8, ma, come ho spiegato, non riesco a risolvere in quel modo. Buona serata
 
Utilizzo di iconv...
http://php.net/manual/en/book.iconv.php
viene archiviato nel file comments.html
Quello che hai fatto qui non è il massimo ti consiglio di vedere come sfruttare un DB anche semplicemente un flat, ossia prendi gestione dei dati potendo accedervi effettuando le operazione elementare sui dati.
Potresti crearne anche uno tuo, ma lo sforzo se non sei pratica è veramente grande, quindi ti consiglio di utilizzare librerie di terze parti o il nativo SQLite php.
Qui alcune librerie abbastanza facili da utilizzare:
1- https://github.com/filebase/Filebase
2- https://www.badpenguin.org/php-flatfiledb
3- https://github.com/Greg0/Lazer-Database

Nel caso invece ti volessi cimentare nella creazione di un tuo DB con le tue logiche, metodi etc, ti consiglio di utilizzare la notazione JSON.

Per quanto riguarda la visualizzazione dei dati da stampare all'interno del file basterebbe aggiungere un sistema di templating per facilitare la scrittura e la comprensione del codice separando la logica dalla view.
 
vediamo se questo esempio ti aiuta,
PHP:
header("Content-Type:text/html; charset=utf-8");
$file = fopen("_testCaratteri.html", 'wb');
fwrite($file, pack("CCC",0xef,0xbb,0xbf));

fwrite($file, utf8_encode('àéèìòù - abcdefgthijk - Ññáéí<br />'));
fwrite($file, utf8_encode('Ññáéí - abcdefgthijk - àéèìòù<br />'));

fclose($file);

Risultato,

upload_2019-1-16_12-24-13.png


upload_2019-1-16_12-25-13.png
 
Ringrazio tutti per le risposte e cerchero` di capirci qualcosa, ma temo che, al momento, sia superiore alle mie forze :(
 

Discussioni simili