miércoles, junio 24, 2009

Manejando palabras acentuadas en PHP y Javascript

Antes de comenzar con el aspecto de la programación, una regla sobre gramática: las mayúsculas siempre, siempre, siempre se acentúan.

Dicho lo anterior, me tope con el caso en php que tenia una lista de opciones basadas en un select que no me mostraba los acentos correctamente. MySQL y php por omisión usan utf-8, por lo que es buena practica poner nuestro html en utf-8:

   1: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">




Ahora bien, Javascript no utiliza por omisión utf-8, asi que cuando coloque un texto mediante document.write, la pantalla desplego el texto acentuado como un carácter especial de html (html entity):





   1: function changecities( formObj )


   2:  {


   3:    statesObj = eval( "formObj.states" );


   4:  


   5:    state = statesObj[statesObj.selectedIndex].value;


   6:    citiesObj = eval( "formObj.elements['cities']" );


   7:  


   8:    // remove all entries


   9:    citiesNum = citiesObj.length;


  10:    for (i=(citiesNum-1); i >= 0; i--)


  11:    {


  12:      citiesObj.options[i] = null;


  13:    }


  14:    // add entries based on area selected


  15:    switch (state){


  16: case "3":


  17:    citiesObj.options[0] = new Option("Comondú",17);


  18:    citiesObj.options[1] = new Option("La Paz",18);


  19:    citiesObj.options[2] = new Option("Loreto",19);


  20:    citiesObj.options[3] = new Option("Los Cabos",20);


  21:    citiesObj.options[4] = new Option("Mulegé",21);


  22:    citiesObj.options[0].selected = true;


  23:    break;


  24:  


  25:     }


  26: }...




image



Php tiene una instrucción para transformar esto caracteres, de su valor al carácter que queremos:





   1: <?php html_entity_decode(“&#250”); ?>




Debe dar como resultado “ú”



image



Pero como vemos en la imagen, el select no se despliega correctamente pues en realidad la instrucción html_entity_decode da como resultado un conjunto de caracteres “ISO-8859-1”, así que podemos optar por hacer una de dos cosas:




  1. Usar utf8_encode:



       1: <?php utf8_encode(html_entity_decode(“&#250”)); ?>





  2. Cambiar la opción del conjunto de caracteres en la instrucción html_entity_decode(string,quotestyle,character-set):




  3.    1: <?php html_entity_decode("&250;",ENT_COMPAT,"UTF-8") ?>







El despliegue es:



image



Listo!

No hay comentarios.: