Behavior para converter entre iso-8859-1 e utf-8

Por Augusto César Ferreira (gutocf)
Para aplicações que utilizam múltiplas bases com codificações diferentes, utilize utf-8 como padrão e para os models que se conectam aos bancos com codificação iso-8859-1 inclua este behavior

Classe de Model:

Baixar código <?php 

    
/***********************************************************
    
    Converte dados de iso-8859-1 para utf-8 nos selects 
    Converte dados de utf-8 para iso-8859-1 nos inserts/updates    
    
    ***********************************************************/

    
class Iso2utfBehavior extends ModelBehavior {
        
        function 
afterFind(&$model$results$primary){
            
$this->r_utf8_encode($results);
            return 
$results;
        }
        
        function 
beforeSave(&$model){
            
$this->r_utf8_decode($model->data);
            return 
true;
        }
        
        function 
r_utf8_encode(&$array){
            
$keys array_keys($array);
            for(
$i 0$max count($keys); $i $max$i++){
                if(
is_array($array[$keys[$i]])){
                    
$this->r_utf8_encode($array[$keys[$i]]);
                } else {
                    
$array[$keys[$i]] = utf8_encode($array[$keys[$i]]);
                }
            }
        }
        
        function 
r_utf8_decode(&$array){
            
$keys array_keys($array);
            for(
$i 0$max count($keys); $i $max$i++){
                if(
is_array($array[$keys[$i]])){
                    
$this->r_utf8_decode($array[$keys[$i]]);
                } else {
                    
$array[$keys[$i]] = utf8_decode($array[$keys[$i]]);
                }
            }
        }            
    }

?>

 

Comentários 6

Time de comentaristas Comentários do autor
 

Comentário

1 Executar a conversão somente em campos Strings

Olá Augusto,

Tem como estender o Behavior para só realizar a conversão em campos Strings. Numa solução simples há como modificar o 'else' r_utf8_(en|de)code com um 'if(is_string)', algo como:
function r_utf8_encode(&$array){
    $keys = array_keys($array);
    for($i = 0, $max = count($keys); $i < $max; $i++){
        if(is_array($array[$keys[$i]])){
            $this->r_utf8_encode($array[$keys[$i]]);
        } else {
            if (is_string($array[$keys[$i]])){
                $array[$keys[$i]] = utf8_encode($array[$keys[$i]]);
            }
        }
    }
}

function r_utf8_decode(&$array){
    $keys = array_keys($array);
    for($i = 0, $max = count($keys); $i < $max; $i++){
        if(is_array($array[$keys[$i]])){
            $this->r_utf8_decode($array[$keys[$i]]);
        } else {
            if (is_string($array[$keys[$i]])){
                $array[$keys[$i]] = utf8_decode($array[$keys[$i]]);
            }
        }
    }
}

Uma solução melhor seria buscar no Model::schema() as colunas que são do type 'string' e fazer uma intersecção com o array passado.

Bem, é isso, um abraço
Postado Nov 19, 2009 por JoaoJose