Problematiche ricorrenti nello sviluppo di webapp 2/3: encoding

[Voti: 17    Media Voto: 4.3/5]

Turmbau zu Babel - Pieter Bruegel 1563

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

Garda Informatica

Garda Informatica

Garda Informatica sviluppa software su misura nella forma di Web Application, App Ibride per iOS/Android/Windows Phone, Crawler Web, Gestionali Web o semplici Connettori per l'integrazione tra software di terze parti.
Garda Informatica