Mientras llega y no llega PHP 6, con esas mejoras entre las que se encuentra el soporte nativo de UTF-8, algunos tenemos que seguir programando.
Creo que próximamente compartiré la clase de manejo de cadenas que estoy desarrollando, y que soporta 100% utf-8.
De momento voy a compartir una función, que si bien no es la más aconsejable puesto que los arrays en PHP consumen MUCHOS recursos, creo que facilita el uso de cadenas UTF-8, pues se les puede dar el mismo tratamiento que a una cadena normal.
Convertir una cadena UTF-8 a un array tiene 2 grandes ventajas:
- cada elemento del array representa un único caracter
- count sobre el array será equivalente a mb_strlen sobre la cadena
La gran destventaja son los tiempos de conversión y el consumo de memoria, al estar usando un array.
Ayer básicamente programé 2 funciones y cojí prestado un ejemplo que había puesto un usuario en la documentación de PHP.
Las tres versiones de estas funciones las podeis ver a continuación:
function getCharArray1 ($jstring) { $len = mb_strlen ($jstring, 'UTF-8'); if (mb_strlen ($jstring, 'UTF-8') == 0) return array(); $ret = array(); for ($i = 0; $i < $len; $i++) { $char = mb_substr ($jstring, $i, 1, 'UTF-8'); array_push ($ret, $char); } return $ret; } // code from: http://uk3.php.net/manual/en/function.mb-split.php#80046 function getCharArray2 ($jstring) { $len = mb_strlen ($jstring, 'UTF-8'); if (mb_strlen ($jstring, 'UTF-8') == 0) return array(); while ($len) { $ret[] = mb_substr($jstring,0,1,"UTF-8"); $jstring = mb_substr($jstring,1,$len,"UTF-8"); $len = mb_strlen($jstring); } return $ret; } // using mb_check_encoding instead of mb_substr ;) function getCharArray3 ($jstring) { if (mb_strlen ($jstring, 'UTF-8') == 0) return array(); $ret = array (); $alen = strlen ($jstring); $char = ''; for ($i = 0; $i < $alen; $i++) { $char .= $jstring[$i]; if (mb_check_encoding ($char, 'UTF-8')) { array_push ($ret, $char); $char = ''; } } return $ret; }
La función más rápida es la última, que utiliza un pequeño truco que se me ocurrió.
La gráfica representa los tiempos de ejecución de cada una de estas funciones para una serie de iteraciones sobre una cadena notablemente larga.
Leyenda:
- getCharArray1: en rojo
- getCharArray2: en verde
- getCharArray3: en azul
Como se puede comprobar, getCharArray3 es la más rápida (sobre 4x más que getCharArray1 y 6x más que getCharArray2).
Finalmente, aquí teneis el enlace al script de benchmark que he usado para obtener esa gráfica.
English
22/02/2009 at 5:42 pm Permalink
La grafica esta hecha con Open Flash 2!!
!
Excelentes graficas, yo las he empezado a utilizar hace menos de 3 meses con Jquery y he obtenido unas graficas muy dinamicas
23/02/2009 at 2:43 am Permalink
Sabia yo que tenía que poner gráfica
La verdad es que John Glazebrook se lo ha currado a base de bien.
25/03/2009 at 3:15 pm Permalink
Thank you!! That was very, very helpful.
26/03/2009 at 12:57 am Permalink
You are welcome
23/04/2009 at 5:31 am Permalink
This was very helpful Pau, thanks a lot.
The last function is ingenious, really appreciated it. I will use it instead of the classic mb_substr.
25/04/2009 at 11:25 am Permalink
You are welcome Francesco.
Although these functions are helpful one has to be aware they consume a huge amount of memory