Detectando UTF8 en PHP

Enviado por clbustos el 27 Diciembre, 2005 - 3:53am.
Clasificado en: PHP | Programación

No resistí la tentación de hacer lo mismo que hice en Detectando UTF-8 en Ruby, pero en PHP. El resultado es el siguiente:

  1.  <?php
  2.  define("UTF_8", 1);
  3.  define("ASCII", 2);
  4.  define("ISO_8859_1", 3);
  5.  function codificacion($texto)
  6.  {
  7.      $c = 0;
  8.      $ascii = true;
  9.      for ($i = 0;$i<strlen($texto);$i++) {
  10.          $byte = ord($texto[$i]);
  11.          if ($c>0) {
  12.              if (($byte>>6) != 0x2) {
  13.                  return ISO_8859_1;
  14.              } else {
  15.                  $c--;
  16.              }
  17.          } elseif ($byte&0x80) {
  18.              $ascii = false;
  19.              if (($byte>>5) == 0x6) {
  20.                  $c = 1;
  21.              } elseif (($byte>>4) == 0xE) {
  22.                  $c = 2;
  23.              } elseif (($byte>>3) == 0x14) {
  24.                  $c = 3;
  25.              } else {
  26.                  return ISO_8859_1;
  27.              }
  28.          }
  29.      }
  30.      return ($ascii) ? ASCII : UTF_8;
  31.  }
  32.  
  33.  function utf8_encode_seguro($texto)
  34.  {
  35.      return (codificacion($texto)==ISO_8859_1) ? utf8_encode($texto) : $texto;
  36.  }
  37.  ?>

Lo pueden probar con

  1.  <?php
  2.  $a="Ascii";
  3.  $b="ISO-8859-1: áéíóú";
  4.  $c=utf8_encode($b);
  5.  echo utf8_encode_seguro($a)."\n";
  6.  echo utf8_encode_seguro($b)."\n";
  7.  echo utf8_encode_seguro($c)."\n";
  8.  ?>

Si me da el ánimo, haré lo mismo en C. No creo que sea nada tan terrible...


Opciones de visualización de comentarios

Select your preferred way to display the comments and click "Save settings" to activate your changes.
Imagen de usuario

La verdad, no puedo saber si es ISO-8859-1, Windows-1254 o cualquiera de esos.
Ahora, UTF-8 se caracteriza porque tiene una forma muy particular de "avisar" que existen caracteres multibytes dentro de él. En corto, existe una secuencia definida de bits (de los más significativos) que debe seguirse en forma estricta. Los detectores que he puesto en el sitio tratan de detectar esta secuencia. Puedes leer más en ¿Que onda con UTF-8? Sets de caracteres, la web y Ajax.

Enviado por clbustos el 28 Diciembre, 2005 - 5:28am.
icono de usuario

No llego a comprender como en el código, discriminas a ISO-8895-1 de UTF-8. De ASCII, si no me equivoco, basta con saber si algun caracter supera el valor de 127 para descartarlo, verdad?

Por cierto, una fuente "monospace" tipo courier para mostrar el código, estaría bien. :-)

Enviado por Rinoceronte Final (no verificado) el 28 Diciembre, 2005 - 2:49am.

Publicar un comentario nuevo

*
*


*

  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.