Newsgroup: it.comp.www.php
Titolo: caratteri speciali: inserirli come sono, o usare html entities ?

ciao,
ho un'applicazione php che salva dei testi su mysql, e volevo chiedervi come 
gestire i caratteri speciali e i tags HTML nei testi.
Le tabelle sono encodate iso-8859-1 e anche le pagine html usano questo 
charset.
Da applicazione è possibile inserire anche codice HTML (non ho esigenze di 
protezione perchè sono io stesso che inserisco), e inclusi anche i caratteri 
speciali. Ad esempio, nel mio testo potrà scrivere :
<b> questa è una prova </b>
Questo testo verrà salvato nel DB tale e quale a come l'ho inserito.
Sto vedendo che se inserisco letteralmente la "è", il browser me la 
visualizza correttamente.
E' giusto lasciare fare così, o è meglio inserire (usare) le html entities? 
Cioè inserire il testo così:
<b> questa &egrave; una prova </b>
In alternativa, potrei inserire come il primo esempio, e poi usare 
htmlentities() per trasformare i caratteri in entità HTML. Lo svantaggio è 
però che perdo la possibilità di inserire marcatori HTML per formattare il 
testo, perchè verrebbero "escaped" loro stessi.
Spero di essere stato chiaro, che ne pensate ?
Quale è la soluzione più pulita ?
grazie, ciao

 E' giusto lasciare fare così, o è meglio inserire (usare) le html entities?
Utilizza le  html entities oppure un editor wyciwyg (es. fckeditor,
tynymce) che ti permette di inserire visualmente il contenuto HTML e
gestisce in automatico la codifica delle entità.
--
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

>Utilizza le  html entities oppure un editor wyciwyg
Quindi in altre parole mi suggerisci di salvare i testi suil DB con dentro 
le html entities ?
Non è un pò bruttino ?



Io li salvo così come sono usando utf-8 per pagina html, tabelle e 
connessione mysql
Ciao

 connessione mysql
per quanto riguarda utf-8, anche se usi iso-8859 (purchč sia su db sia su
pagina html) tutto funziona correttamente lo stesso (i caratteri accentati
sono inclusi nell'iso-8859 ad esempio)
Per quanto riguarda il fatto di salvare i caratteri speciali (esempio, le
lettere accentate) cosě come sono, e poi metterli nella pagina html di
output cosě come sono, ho visto che i browser sembrano renderizzarli
correttamente.
Dovrei quindi procedere cosě, cioč salvare direttamente le lettere accentate
e poi scriverle tali e quali nelle pagine html, oppure trasformarle al volo
in html entities, o oppure ancora scriverle in forma di html entities dentro
il database ?

 forma di html entities dentro il database ?
Secondo me è meglio salvare i caratteri accentati così come sono.
Poi applichi all'output tutte le trasformazioni del caso.
Ciao

 Poi applichi all'output tutte le trasformazioni del caso.
ok, anche a me piace di più come soluzione
però in tale caso, siccome voglio consentire l'inserimento di html (esempio 
per parole in grassetto, corsivo, e simili), non potrei usare htmlentities() 
per trasformare l'output perchè mi trasformerebbe anche i tag html che ho 
inserito
mi dovrei fare un funzione custom che mi traforma solo lle lettere accentate 
ad esempio.
voi come fate ?

Casper ha scritto :

Per come la vedo io è meglio mantenere coerente in tutta l'applicazione
lo stesso charset (che sia iso-8859-1 o utf-8 a seconda delle tue
esigenze) e non usare htmlentities per salvare il contenuto nel db.
Questo anche per un altro motivo: immagina ad esempio che vuoi andare a
controllare direttamente nelle tabelle del db. Se mantieni separata la
visualizzazione html con la logica di memorizzazione nel db,
sicuramente questo compito ti risulta più agevole, in quanto cvedrai la
"è" come "è" e non come "&egrave;".
Quindi, per come la vedo io, posto che ci sia coerenza di charset
dappertutto, da un punto di vista logico è giusto conservare le cose
per quello che sono.
Una piccola nota, se per caso inserirai il carattere "&" nei tuoi
testi, in accordo a questa logica sarà giustamente memorizzato nel db
come "&". Il problema però è che quando andrai a fare una validazione,
il validatore riconoscerà questa come inizio di un'entità, e non
trovando il resto ti darà problemi. Ecco perché generalmente con questo
carattere va bene memorizzarlo come "&", però "forse" è più opportuno
in fase di prelievo da db convertirlo in "&amp;", magari con un banale
str_replace.
Spero ti sia stato di aiuto.
-- 
rob4you

 Spero ti sia stato di aiuto.
sicuramente si, quindi in pratica mi conviene scrivere una funzione di 
replace custom che mi vada a sostituire determinati caratteri con le forme 
html entities equivalenti in fase di visualizzazione, lasciando invece 
inalterati eventuali tag html che posso aver scritto direttamente cosi nel 
db per avere ad esempio il testo in grassetto ( <b> testo in grassetto 
</b> )
giusto?

 </b> )
Non ho detto esattamente questo. Cioè ho detto che forse per quanto
riguarda il carattere "&", esclusivamente per una questione di
validazione w3c, sarebbe meglio sostituirlo con l'apposita entità.
Per tutti gli altri caratteri mi sembra che non ci siano problemi,
purché sia coerente il charset ovunque. Quindi i caratteri accentati
non dovrebbero darti problemi, i caratteri che delimitano i tag ("<" e
">") e gli apici singoli ' e doppi " non dovrebbero esser convertiti
nel tuo caso visto che tu conti di includere anche direttamente codice
html.
Un'altra alternativa sarebbe un po' cambiare la logica, e usare ad
esempio un editor come tinyMCE oppure FCKeditor, oppure utilizzare a
mano una codifica particolare tipo i BB-code.
Ma per come la vedo io, per il tuo caso specifico, va benissimo
lasciare tutto come sta, e gestire a mano caratteri speciali come "&"
(non me ne vengono altri sinceramente, a dir la verità dovresti
controllare ad esempio il carattere di copyright, che in entità è
"&copy;" come viene visualizzato se scritto direttamente).
-- 
rob4you

 validazione w3c
uhm credo di aver capito .
E' vero, nel browser un carattere accentato si legge bene, sto usando la 
stessa codifica iso-8859 sia sul db sia nelle pagine html.
Ma quindi l'uso delle html entities (ad esempio per i caratteri accentati) 
serve a proteggere dai casi in cui si usano codifiche caratteri differenti ? 
Se ho capito bene ?

 Se ho capito bene ?
Come il manuale di php suggerisce, la funzione htmentities e la
funzione htmlspecialchars sono utili per prevenire che l'utente possa
inserire markup html, ad esempio in un guest book o in un forum.
Non è il tuo caso, ma se un utente qualsiasi potesse inserire del testo
qualsiasi nelle pagine html, potrebbe metterci qualsiasi cosa, anche
tag javascript ad esempio. Per evitare questa cosa generalmente si
usano due approcci: usare stip_tags, che ti elimina incondizionatamente
(o in base a una lista che gli passi tu) tutti i tag, e quindi alla
fine resta solo testo; usare htmlspecialchars o htmlentities che
convertono tutti i caratteri speciali in entità (e quindi anche i
delimitatori dei tag).
Questo è un possibile uso di queste funzioni.
Un altro è ad esempio se tu usi un editor che non ha la possibilità di
impostare la codifica. Se ad esempio provi a usare il banalissimo
notepad e scrivi qualcosa tipo:
<?php
header('Content-Type: text/html; charset=utf-8');
$variabile            = 'voilà';
$variabile_bonificata = htmlentities($variabile);
echo $variabile . '<br>' . $variabile_bonificata;
?>
Vedrai che Il carattere "à" lo vedrai sicuramente male nel primo caso,
e bene nell'altro. Ecco un altro caso in cui possono rivelarsi utili le
funzioni come htmlentities e htmlspecialchars. Stessa cosa dicasi per
l'estrazione di dati da db, o più in generale per la visualizzazione di
dati che ti provengono da fonti che tu non controlli direttamente (come
anche un file di testo ad esempio).
Tutto chiaro ora? ;)
-- 
rob4you

 Tutto chiaro ora? ;)
si grazie :-)