Behavior para converter entre iso-8859-1 e utf-8
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
Comentário
1 Executar a conversão somente em campos Strings
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