[Php-avanzado] Plazo de entrega

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Lun Jul 14 14:53:18 ART 2014


Hola Gabriel!

El lun, 14-07-2014 a las 14:20 -0300, Gabriel Lenti escribió:
> Lo mande el 3/7, pero si preferís puedo volver a enviar una versión
> mas reciente, he mejorado varias cosas ya.

	Dale! Enviame una versión más nueva, y avisame por favor por la lista.

> Una de las dudas q tengo es con respecto al menejo del juego de
> caracteres de los datos entrantes desde el cliente. Me acuerdo q nos
> comentaste algo al respecto en la ultima clase. Cuando busque no
> encontré poca info sobre el tema, así q arme algo mas bien a prueba y
> error. Pero le tengo dudas sobe su correcto funcionamiento y de si
> haría falta agregar algún juego de caracteres mas en la secuencia de
> reconocimiento. Este es el código:
> 
> foreach ($_GET as $k => $v) {
>     if (is_array($v)) {
>         foreach ($v as $y => $x) {
>             if (!($from = mb_detect_encoding($x, 'UTF-8,
> ISO-8859-1'))) $from = 'auto';
>             $v[$y] = mb_convert_encoding($x, 'utf8', $from);
>         }
>         unset($x);
>         $_POST[$k] = $v;
>         continue;
>     }
>     if (!($from = mb_detect_encoding($v, 'UTF-8, ISO-8859-1'))) $from
> = 'auto';
>     $_POST[$k] = mb_convert_encoding($v, 'utf8', $from);
> }
> 
> Idem para $_POST

	La conversión está bien estructurada, pero tiene una cosa rara.
	Por un lado el:

!($from = mb_detect_encoding($v, 'UTF-8, ISO-8859-1')) 

	funciona medio de casualidad, porque al no ser en modo estricto, podría
no coincidir con algunos juegos de caracteres. En realidad, la lógica es
más fácil

si (no se detecta UTF-8)
entonces: convierto todo a UTF-8

if (mb_detect_encoding($_POST[$k]) != 'UTF-8') {
	$_POST[$k] = mb_convert_encoding($_POST[$k],'UTF-8');
}

porque lo que se quiere es convertir todo a un juego de caracteres, en
este caso UTF-8, pero si ya es UTF-8 no hacer una doble conversión, ya
que puede romper algunas caracteres.

	Después el continue; en vez de usar un else es solo para complicarte la
vida y hacer el código más difícil de leer.
	Si querés complicarte, hace una función recursiva que si es string,
converta y si es array, se llame a si misma ;-)

	Saludos!

-- 
Leonardo Tadei
leonardot en pegasusnet.com.ar
Web: http://leonardo.tadei.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado