Voy a hacer una pequeña introdución con una anecdota.
Suelo ír a una libreria a comprar libros; lo curioso de ésta librería es que en la puerta, con un rotulo en rojo, pone “libros en Español“.
Un día fui a comprar un libro, más que nada porque el autor estaba allí. Llego a la librería, entro y hablo con el autor del libro y me dice que el libro está escrito en Francés; porque el cree que ese idioma es mucho más romántico y va más acorde con los relatos que el narra en el libro.
Llego a casa; contento porque traigo el libro firmado y me ha salido bien de precio. Lo abro y cual es mi sorpresa; ¡el libro está escrito en Ingles! WTF?
Pues bien; ahora vamos a hacer una pequeña conversión de identidates; para poder extrapolar el caso a el tema de codificación de carácteres:
Librería = Servidor web(IIS, Apache, …)
Autor del libro = el programador; creador del documento web
El libro = documento web
yo, lector = navegador web(firefox, Internet Explorer)
Lo primero; yo(como el navegador web) me acuerdo de la madre que pario al de la librería, y al autor; porque me están timando. Pero bueno ya tengo el libro y tendré que leerlo, que para eso lo he comprado, pero antes tendré que saber como tengo que leer el libro.
Hay una diferencia entre yo y el navegador web; el navegador web sabe muchos idiomas, pero no sabe identificarlos; esto es que hay que decirle en que “idioma” tiene que leer el libro.
Así que el navegador tiene una regla(porque se lo marca los estándares) y es que va a hacer caso a la librería(servidor) y va a intentar leer mi libro en Español, por lo que comienza a balbucear tonterías sin sentido(esto es lo que pasa cuando vemos webs con simbolos raros, sin acentos, …)
Pero el “autor” (programador) sabe un truquito para que se salte a la librería y le haga caso a él, y le dice algo como:
“el cabecera de este documento pone que está en francés, así que léelo en francés”
Que más o menos fue lo que me dijo cuando compre el libro, así en voz muy bajita para que no me escuchase el dueño de la librería.
Pero claro; el navegador, con su inocencia que le caracteriza, le hace caso y comienza a leer el libro en francés, y la misma canción; a balbucear tonterías sin sentido.
Por lo que yo he identificado a los culpables para que estas cosas pasen;
Por lo que señores programadores; poneros de acuerdo con lo que dice el servidor y poner en el Doctype la verdadera codificación de carácteres y dejen de tocar las narices.
update: Recomiendo esta lectura:
ASCII, Unicode, UTF-8 y la Iñtërnâçiônàlizæçiøn - parte I
En esta primera parte voy a generar una lista de árbol desde un array() que me he inventado, a modo de ejemplo; en la siguiente lo haré desde una base de datos; que es más fácil aún.
Por ahora para poder ver técnica nos vale; así será mucho más sencillo de comprender.
Lo primero es crear nuestra tabla de datos; una table que necesita de un requisitos; tener dos llaves. La primera llave será el Id del padre, el segundo será el Id de la variable o hijo.
$lista[idPadre][id]
Luego necesitamos una función recursiva que nos cree la lista; pero a esta función habrá que pasarle un parámetro, para decirle a partir de donde necesita crear el árbol(tree).
pego el código; y así lo podréis ver mejor:
<!– @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } –>
<?php
$lista=array();
$lista['0']['1']=‘parque’;
$lista['0']['2']=‘colegio’;
$lista['0']['3']=‘casa’;
$lista['1']['4']=‘cosas’;
$lista['1']['5']=‘gente’;
$lista['1']['6']=‘plantas’;
$lista['2']['7']=‘mesa’;
$lista['2']['8']=’silla’;
$lista['2']['9']=‘jardin’;
$lista['3']['10']=‘profe’;
$lista['3']['11']=‘gamberro’;
$lista['3']['12']=‘lapiz’;
$lista['6']['13']=‘árbol’;
$lista['6']['14']=‘flor’;
$lista['6']['15']=‘agua’;
$lista['9']['16']=‘jasmin’;
$lista['9']['17']=‘lirios’;
$lista['5']['18']=‘pedro’;
$lista['5']['19']=‘maría’;
function generaArbol($idPadre, &$lista)
{
if(!isset($lista[$idPadre])){
return ”;
}
$level = $lista[$idPadre];
$out = ‘<ul>’;
foreach($level as $k=>$v){
$out .= ‘<li>’;
$out .= $v;
$out .= generaArbol((string)$k, $lista);
$out .= ‘</li>’;
}
$out .= ‘</ul>’;
return $out;
}
echo generaArbol(‘0′, $lista);
?>
Uno de las cosignas en el mundo de la programación, que más he escuchado en el trabajo es:
“hay mil maneras de programar; pero solo una es la buena”
cuando escucho eso me aterroriso; porque nunca sé si lo hago bien o mal. Usí que hoy voy a explicar una cosa sencilla, pero que he visto muchas maneras de hacer.
Código que utilizo con frecuencia para hacer un interlineado html desde php:
<?php $clases=array(‘uno’, ‘dos’, ‘tres’); ?>
<style>
.uno td{background-color:#ccc}
.dos td{background-color:#0fc}
.tres td{background-color:#999}
</style>
<table>
<?php for($i=0, $line=0; $i < 50; $i++, $line==3?$line=0:$line++): ?>
<tr class=“<?php echo $clases[$line]; ?>“>
<td> hola</td>
</tr>
<?php endfor; ?>
</table>
la variable $line es la que marca el tiempo de ciclo del interlineado; puede que no sea un código demasiado “elegante” pero creo que es de fácil comprensión para cualquiera
llevo una semana muy agobiado; por la cantidad de trabajo . Pero también porque tenía que hacer una cosa que en principio era de lo más fácil de implementar.
Una autentificasión en Ldap con Nusoap(una librería para utilizar Soap); porque el server está en php4 (si aún quedan muchas empresas con PHP4) y desde ayer que llevo rompiendome la cabeza con un error.
al final, después cruzar unos emails con los desarrolladores del esrvicio, en EEUU. he podido corregir el error, pero cuando he visto donde estaba el error, no sabía si tirarme por la ventana o dejar esta profesión.
Mi gran error fue: Olvidarme de poner la barrita al final del parametro URI= “http://dominio.com/”
espero no ser el único que comete estos errores y tarda más de un día en darse cuenta de la gran metedura de pata ![]()
he seguido todos los pasos para poder instalar Xdebug:
Creo que el debuger se lanza, pero por algún motivo no veo hace caso a los breakpoint ni nada.
He montado un vídeo explicando mi problema; a ver si alguno me podría ayuda
[youtube=http://www.youtube.com/watch?v=wl55BOOXL7I]
update
Copio el config de php.ini a ver si estoy haciendo algo mal:
zend_extension_ts=C:\Archivos de programa\EasyPHP 2.0b1\php5\ext\php_xdebug.dll xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.idekey=default
Akra’s ha escrito una clase bastante sencilla y muy útil para poder utilizar Zend_Cache File.
ejemplo de uso:
$cacheEnabled = (bool)getenv('THE_CACHE_ENABLED') ? getenv('THE_CACHE_ENABLED') : false; TheCache::init($cacheEnabled, TMP_DIR.'/the-cache/'); $keyName = 'data-z-a-b'; // unique name describing this data set $data = TheCache::load($keyName) if($data === false) { $sql = 'SELECT x,y FROM z WHERE a=b'; $rs = $db->Execute($sql); $data = $rs->GetArray(); TheCache::save($keyName, $data); } Enlace a TheCache
Symfonians es el nombre de la nueva aplicación, publicado con licencia CC. La aplicación está echa con Symfony, así que para los desarrolladores de Symfony es una fantastica noticia.
enlace al proyecto: http://symfonians.org/
enlace a demo: http://symfonians.net/
Enrique Place comentaba(en un post) la situación de estándares de codificación que tenemos en php, y como somos los más anarquistas en este tema.
De ese post, que recomiendo la lectura del PDF con el estilo que propone Zend, me quedo con una frase:
“No eres tan especial como para crear tu propio estándar”
enlace a: Presentación: “Buenas Prácticas de Desarrollo en PHP”