Futuraweb, extend you brand online

I ricorrenti problemi con le lettere accentate e i caratteri “strani” costringono una volta per tutte a cercare una soluzione per lavorare in armonia con tutti gli alfabeti.

UTF-8 e’ acronimo di Unicode Transformation Format-8 ed è una codifica (encoding) dei caratteri Unicode in un numero variabile da 1 a 4 di byte. Questo sistema garantisce una rappresentazione di un elevato numero di caratteri, di molto superiore per esempio allo standard ASCII a 1 byte che ne codifica solo 128.

Per utilizzare questo tipo di codifica è necessario allineare tutti i nostri strumenti in modo che parlino la stessa lingua: l’utf8.

Cominciamo da apache.
Alcuni sistemi sono configurati in modo che apache processi le pagine in utf-8, altri in latin-1 (iso-8859-1). Per garantire un comportamento identico su ogni piattaforma, dobbiamo imporre che apache applichi lo stesso “trattamento” ai files, indipendentemente dalla configurazione.
Il modo piu’ semplice consiste nell’imporre la direttiva AddDefaultCharset nel file .htaccess:

AddDefaultCharset UTF-8

Proseguiamo con il browser.
Istruire il browser è molto semplice, basta aggiungere o modificare il preposto meta-tag nell’header del documento:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Dopodichè dobbiamo assicurarci che il nostro database, sempre se ne usiamo uno, utilizzi lo stesso charset. Per conoscere i charset e le collation disponibili usiamo la query:

SHOW CHARACTER SET

mentre impostare il charset con cui il database comunicherà con un qualunque programma (php nel nostro caso) usiamo quest’altra query:

SET NAMES 'utf8';

E’ importante quindi assicurarsi che la query precedente venga eseguita prima di qualunque altra query quindi, per comodità, è possibile eseguirla dopo aver creato la connessione con il database.

In cakephp questa operazione può essere automatizzata modificando o creando il file /app/app_model.php

<?php
class AppModel extends Model {
	function __construct() {
		parent::__construct();
		if(!defined('GLOBAL_UTF8')) {
			$this->query("SET NAMES 'utf8'");
			define('GLOBAL_UTF8', TRUE);
		}
	}
}
?>

che non fa altro che definire una costante (GLOBAL_UTF8) e se non è già stata definita precedentemente esegue la query che abbiamo introdotto prima.

Infine dobbiamo preoccuparci che l’escaping di php renderizzi correttamente il testo codificato con utf-8. Utilizzeremo sempre la classica funzione htmlentities (anzi la simile htmlspecialchars) sfruttando però il terzo argomento.

htmlspecialchars("stringa di testo in utf-8", ENT_QUOTES, 'UTF-8');

Per approfondire:

http://it.wikipedia.org/wiki/UTF-8

http://dev.mysql.com/doc/refman/5.0/en/charset.html

http://cakebaker.wordpress.com/2006/01/16/trouble-with-utf-8/

http://php.net/htmlspecialchars

Leave a Reply