Detectando UTF8 en PHP
Enviado por clbustos el Lun, 26/12/2005 - 23:53.
Clasificado en:
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:
- 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;
- }
- function utf8_encode_seguro($texto)
- {
- return (codificacion($texto)==ISO_8859_1) ? utf8_encode($texto) : $texto;
- }
Lo pueden probar con
- $a="Ascii";
- $b="ISO-8859-1: áéíóú";
- $c=utf8_encode($b);
- echo utf8_encode_seguro($a)."\n";
- echo utf8_encode_seguro($b)."\n";
- echo utf8_encode_seguro($c)."\n";
Si me da el ánimo, haré lo mismo en C. No creo que sea nada tan terrible...
- 10710 lecturas

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. :-)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.
La solucion para acentos y caracteres latinos en hosting yanquis seria, incluir la siguiente linea en el encabezado de la pagina principal de nuestro sitio:
header('Content-Type: text/html; charset=UTF-8');
?>
a mi me funciono de primera en mi sitio estaba chato con los acentos y colocando en todos mis sitios ó >> ó etc.
espero a alguien le sirva
gracias, esa solucion me ayudo a resolver mi problema
Muchas gracias, tu código me ha salvado de un apuro :)
Para eso estamos!
Enviar un comentario nuevo