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; } ?> read more

Leer más » 2 Comentarios

Kinect + DepthJS + Ubuntu + FX = Minority Report

¿Te gustaría navegar a lo Minority Report? Pues bien, demos la bienvenida a DepthJS, una extensión del navegador web Mozilla Firefox que nos permite que cualquier página web interactue con Kinect a través de JavaScript.

DepthJS es mucho más que una nueva forma de navegar. La idea fundamental es que ahora los desarrolladores web que se especializen en Javascript pueden trabajar con el Kinect sin tener que aprender un nuevo lenguaje o código especial de comunicación. Esto permitirá una nueva serie de interacciones más allá de lo que desarrolló por primera vez. read more

Leer más » 10 Comentarios

Instalar LAMP en Ubuntu 10.10

Sí, quizás muchos de vosotros lo habréis hecho con anterioridad y ya sabréis que LAMP es el acrónimo de Linux Apache MySQL HP; pero la realidad es que tras instalar la nueva versión de Ubuntu, la 10.10, parece que el selector de paquetes por tareas del gestor de paquetes Synaptic ahora no existe, y tenemos que instalarlo manualmente.

La tarea es bien sencilla, desde un terminal, instalamos el paquete tasksel, el mismo que utiliza Synaptic internamente para realizar esta tarea:

ahornero@6581-D:~$ sudo apt-get install tasksel read more

Leer más » 38 Comentarios

Frameworks para PHP y CSS

El otro día hablando con una amigo sobre programación y desarrollos en la Web me di cuenta de que existían muchos más frameworks (entornos de trabajo) para el lenguaje de programación PHP y la hoja de estilos CSS de los que pensabábamos. Así que esta mañana me he puesto a buscar algunos de los más populares (y otros no tanto) y aquí os presento la enumeración:

Frameworks para PHP:

Frameworks para CSS:

Y bien, estos han sido todos los que he encontrado. Supongo que alguno me me habré dejado atrás, así que se aceptan comentarios para completar la lista, sugerencias y opiniones sobre la propuesta. read more

Leer más » 3 Comentarios

ANOLOGUE, sala de chat libre.

Es posible que muchos de vosotros penséis que las salas de chat están muertas. Pero no creo que sea así, muchas veces necesitamos mantener una conversación simultánea con ciertas personas y no todas disponen de un servicio de mensajería instantánea.

La solución: crear una sala de chat en un servidor (privado o público) para una comunicación colectiva. Y es aquí donde entra ANOLOGUE, son comentarios, conversaciones, compartir imágenes, en definitiva distribuir información de manera conjunta haciendo uso de su plataforma de chat integrada para este propósito, y que podremos usar libremente o descargar para montarlo en nuestros sistemas. read more

Leer más » 3 Comentarios

Descargar ficheros sin usar enlaces con PHP

Cuando me refiero a no usar enlaces, me refiero a no usar enlaces al fichero en sí, por ejemplo: https://www.linuxhispano.net/logo.jpg sino a algo así como http://www.dominio.com/obtener_fichero.php?id_fichero=100.

¿Con qué idea podemos querer utilizar esto? Además de ocultar algo más de nuestra estructura interna, que siempre viene bien, es útil saber cómo descargar ficheros de este modo para tener un mayor control sobre el flujo, de forma que podamos comprobar rol de la persona que descarga, acceder a una base de datos para obtener el fichero de un campo BLOB o culaquier otro tratamiento que queramos hacer.

Para ello con PHP y suponiendo que tenemos el fichero ya accesible en disco (si está almacenado en una BBDD una solución podría ser crear un temporal mientras tanto), sólo tendremos que hacer lo siguiente:

header('Content-Description: File Transfer');
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename='.basename($ruta));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . obtenerTamanhoFichero($ruta));
readfile($ruta);

exit;

Utilizo una funcion obtenerTamanhoFichero que ahora os presentaré porque la función equivalente de PHP en ocasiones no funciona correctamente. Por cierto, el fichero en cuestión estará en la ruta indicada por la variable correspondiente, $ruta.

function obtenerTamanhoFichero ($url) { if (substr($url,0,4)=='http') { $x = array_change_key_case(get_headers($url, 1),CASE_LOWER); if ( strcasecmp($x[0], 'HTTP/1.1 200 OK') != 0 ) { $x = $x['content-length'][1]; } else { $x = $x['content-length']; } } else { $x = @filesize($url); } return $x; } read more

Leer más » 2 Comentarios

Oculta la información de errores y “warnings” en PHP

En ocasiones por comodidad, y sobre todo para ahorrarnos dar más información de la cuenta de cara a la seguridad y a que aparezcan mensajes de errores en la pantalla del cliente, es preferible ocultar la información de depuración que nos devuelve el intérprete PHP mediante las típicas líneas de error y warning.

La forma más cómoda para hacerlo instrucción a instrucción es el uso del prefijo @ delante de la misma. El error o warning seguirá existiendo pero no se generará una salida HTML describiéndola. read more

Leer más » 3 Comentarios

¿Cómo cambiar la clave de un usuario en WordPress desde MySQL?

Imaginad que habéis perdido vuestra contraseña de usuario en WordPress, es posible que si somos el único usuario y a la vez es administrador, el problema sea grande. Sin embargo, si tenéis acceso a la línea de comandos de MySQL de forma directa o a través de alguna aplicación como phpMyAdmin o SQLyog (sé que es una aplicación para Windows pero va perfectamente con Wine y me resulta muy cómoda) no hay problema. read more

Leer más » 6 Comentarios

Programando webs para iPhone e iPod Touch

Os dejo una serie de consejos muy útiles para que no tengáis problemas en el desarrollo de sitios web para iPhone. La fuente original en inglés es CatsWhoCode.

Detectar si es iPhone o iPodTouch utilizando JavaScript

if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) {
    if (document.cookie.indexOf("iphone_redirect=false") == -1) {
        window.location = "http://m.espn.go.com/wireless/?iphone&i=COMR";
    }
}

Detectar si es iPhone o iPodTouch utilizando PHP

if(strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'],'iPod')) {
    header('Location: http://yoursite.com/iphone');
    exit();
}

Definir la anchura del iPhone como el viewport

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;"&mt; read more

Leer más » 3 Comentarios

Comparar fechas en formato MySQL con PHP

Es un problema con el que cualquier persona que utilice PHP y MySQL se encuentra muy a menudo. Hasta que PHP no trate directamente esos datos y se sobrecarguen internamente los operadores de comparación para que todo sea directo, tendremos que valernos de métodos como el que os muestro para poder comparar dos fechas en formato MySQL con PHP (formato MySQL, es decir fecha en formato inglés con guiones y el orden invertido respecto al nuestro).

La siguiente función devuelve:

  • 1 si la fecha a es mayor que la fecha b
  • 0 si son iguales
  • -1 si la fecha a es menor que la fecha b

function comparar_fechas_mysql($a, $b) { $a_v=explode("-",$a); $anyo_a = $a_v[0]; $mes_a = $a_v[1]; $dia_a = $a_v[2]; $b_v=explode("-",$b); $anyo_b = $b_v[0]; $mes_b = $b_v[1]; $dia_b = $b_v[2]; if($anyo_a > $anyo_b) return 1; else { if($anyo_a < $anyo_b) return -1; else { if($mes_a > $mes_b) return 1; else { if($mes_a < $mes_b) return -1; else { if($dia_a > $dia_b) return 1; else { if($dia_a < $dia_b) return -1; else return 0; } } } } } } read more

Leer más » 7 Comentarios