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: }...
Php tiene una instrucción para transformar esto caracteres, de su valor al carácter que queremos:
1: <?php html_entity_decode(“ú”); ?>
Debe dar como resultado “ú”
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:
- Usar utf8_encode:
1: <?php utf8_encode(html_entity_decode(“ú”)); ?>
- Cambiar la opción del conjunto de caracteres en la instrucción html_entity_decode(string,quotestyle,character-set):
1: <?php html_entity_decode("&250;",ENT_COMPAT,"UTF-8") ?>
El despliegue es:
Listo!
Comentarios