Categorías: Tutoriales

Detectar UTF-8, ASCII e ISO 8859-1 en PHP

La importancia de los juegos de caracteres y los collation es algo básico para tratar con cadenas de textos y más aún si hablamos un lenguaje que no “entra” dentro del ASCII como es nuestro caso. En Linux Hispano ya hablamos en su momento de este tema:

Hoy volvemos a hablar, pero en un contexto más práctico. Cuando trabajamos con PHP, tenemos instrucciones que nos permiten codificar o decodificar texto en diferentes formatos, por ejemplo: utf8_decode o utf8_encode. Sin embargo, no existe un método que nos confirme de manera directa si el texto está en cierta codificación o no.

En PHP y Otras Yerbas, nos muestran una serie de funciones de gran interés para conseguir justo esto, detectar la codificación que usa un texto:

<?php
define("UTF_8", 1);
define("ASCII", 2);
define("ISO_8859_1", 3);
function codificacion($texto)
{
 $c = 0;
 $ascii = true;
 for ($i = 0;$i<strlen($texto);$i++) {
  $byte = ord($texto[$i]);
  if ($c>0) {
   if (($byte>>6) != 0x2) {
    return ISO_8859_1;
   } else {
    $c--;
   }
  } elseif ($byte&0x80) {
   $ascii = false;
   if (($byte>>5) == 0x6) {
    $c = 1;
   } elseif (($byte>>4) == 0xE) {
    $c = 2;
   } elseif (($byte>>3) == 0x1E) {
    $c = 3;
   } else {
    return ISO_8859_1;
   }
  }
 }
 return ($ascii) ? ASCII : UTF_8;
}
?>

De esta forma nos evitamos tener el problema de convertir en UTF-8 una cadena que ya lo está. En el mismo blog nos dejan una función para hacer conversiones, con chequeo previo:

function utf8_encode_seguro($texto)
{
     return (codificacion($texto)==ISO_8859_1) ? utf8_encode($texto) : $texto;
}
F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • Pero PHP ya tiene funciones para trabajar con Unicode (MultiByte Strings) que empiezan con mb, eso se podría hacer:

    if (!mb_check_encoding($texto, 'UTF-8'))
    $texto = mb_convert_encoding($texto,'UTF-8');
    }

    Tambien se puede usar utf8_encode en vez de mb_convert_encoding.

Entradas recientes

DeepSeek

3 días hace

Contacto

2 semanas hace

Smart-tv mute

2 semanas hace

STEAM OS

3 semanas hace

2025

1 mes hace

El podcast de Linux Hispano – #072 – El hardware libre debe consolidarse como el software libre

https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.

1 mes hace