Dopo la gestione dell'escaping vediamo la gestione dell'encoding.
Questo problema ha origini storiche e dipende dal fatto che, agli albori della computazione, quando le risorse erano limitate, si preferì individuare un sott'insieme di tutti i caratteri noti per poter dialogare con un computer, questo sott'insieme coincideva sostanzialmente con i caratteri dell'alfabeto latino i numeri e qualche altro carattere di utilità .
Questo insieme di caratteri o charset, noto come ASCII è stato il charset di riferimento fino all'avvento di internet e all'aumento delle risorse a disposizione.
Oggi infatti ad una webapp multilingua viene richiesta la corretta gestione di un charset molto più esteso dell'ASCII, di un charset che contenga più o meno tutti gli alfabeti della terra: latino, arabo, ebraico, cinese, giapponese, ecc.
Questo charset noto come UTF-8 è un superset dell'ASCII, questo significa che è retrocompatibile con l'ASCII, ma che è in grado di rappresentare anche i caratteri degli altri alfabeti.
Per fare ciò sostanzialmente si prevede l'espansione dinamica dell'occupazione di ogni singolo carattere: nel caso dell'ASCII i caratteri occupano 1 byte, nel caso di altri alfabeti possono arrivare ad occupare 4 byte ciascuno.
Come detto precedentemente mentre qualsiasi linguaggio, per ragioni storiche, gestisce nativamente il charset ASCII, ciò non è sempre vero per l'UTF-8.
Nel PHP, per esempio, c'è una libreria apposita per la gestione di stringhe multibyte come nel caso dell'UTF-8 e si chiama appunto Multibyte String .
Questa libreria ripropone tutte le funzioni classiche per la gestione delle stringhe strlen, strtolower, strtoupper, substr ecc. in versione multibyte mb_strlen, mb_strtolower, mb_strtoupper, mb_substr ecc.
Ciò non è però sufficiente, infatti la corretta gestione dell'encoding interessa vari livelli della nostra webapp: dagli header HTTP, all'HTML, al PHP.
Per quanto riguarda gli header HTTP ci dobbiamo ricordare di indicare l'encoding attraverso la funzione header del PHP e del parametro Content-Type come nell'esempio seguente:
header('Content-Type: text/html; charset=utf-8');
Nella sezione head dell'HTML dobbiamo specificare l'encoding della pagina con il meta seguente:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Nel PHP, oltre ad utilizzare la già citata libreria al posto di quella standard per le stringhe, dobbiamo specificare che l' internal encoding della nostra applicazione è UTF-8 utilizzando la funzione mb_internal_encoding
mb_internal_encoding("UTF-8");
E infine anche gli stessi sorgenti PHP devono essere codificati in UTF-8 senza BOM.
Per sapere se una funzione PHP tratta correttamente il multibyte ci si può riferire al seguente articolo Handling UTF-8 with PHP