Foros del Web » Programando para Internet » PHP »

Problemas con la letra Ñ

Estas en el tema de Problemas con la letra Ñ en el foro de PHP en Foros del Web. Tengo un código que crea un indice con las letras por las que empiezan una lista de resultados (nombres) de manera que si, por ejemplo, ...
  #1 (permalink)  
Antiguo 13/06/2014, 10:15
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Problemas con la letra Ñ

Tengo un código que crea un indice con las letras por las que empiezan una lista de resultados (nombres) de manera que si, por ejemplo, hay apellidos que empiezan por la B aparece la letra para pinchar y ver esos nombres pero si no hay ninguno, omite poner la letra. El resultado es una linea así:

A - B - D - E - F - G - M - N - P - R - S - V

El problema lo tengo con la letra Ñ. Para saber cual es la primera letra del resultado, en el código uso substr ($row["apellido1"],0,1) pero esto con la Ñ no funciona. Para que funcione tengo que comparar los dos primeros digitos, en vez del primero solo. Modifiqué el código para que me incluyera la Ñ (con un If) pero aún asi la busqueda de de resultados que empiecen por Ñ me da los mismos resultados que empiezan por N también.

Los documentos los he actualizado estos dias a utf8, así como la base de datos y la conección a la misma.

¿Alguna idea?
__________________
La imaginación es más importante que el saber. - Einstein
  #2 (permalink)  
Antiguo 13/06/2014, 11:46
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problemas con la letra Ñ

Quizas te interese mirar este código que tambien admite acentos en la primer letra de los apellidos:

Código PHP:
Ver original
  1. <?php
  2.     // Codificado en ansi.    
  3.     $apellidos = [
  4.         "becerro",
  5.         "agusto",
  6.         "ñato",
  7.         "nebundi",
  8.         "Ñoco",
  9.         "alpolo",
  10.         "palon"
  11.     ];
  12.    
  13.     $indices = array_unique(
  14.                 array_map(function($val)
  15.                             { return mb_strtoupper(substr($val,0,1)); } // Con esta funcion, obtienes la primer letra del apellido en mayusculas. El resto es para automatizar y no es relevante.
  16.                           , $apellidos
  17.                         )
  18.                 );
  19.          
  20.     var_dump($indices);
  21.    
  22.     // Con esto lo ordenas correctamente.
  23.     uasort( $indices
  24.             , function($val1, $val2)
  25.                 {
  26.                     $val1 = str_replace("Ñ", "NN", strtr($val1,"ÀÈÌÒÙÁÉÍÓÚÄËÏÖÜ","AEIOUAEIOUAEIOU"));
  27.                     $val2 = str_replace("Ñ", "NN", strtr($val2,"ÀÈÌÒÙÁÉÍÓÚÄËÏÖÜ","AEIOUAEIOUAEIOU"));
  28.                     return strcasecmp($val1, $val2);
  29.                 }
  30.           );
  31.          
  32.     var_dump($indices);
  33.    
  34.     /*
  35.     array (size=5)
  36.       0 => string 'B' (length=1)
  37.       1 => string 'A' (length=1)
  38.       2 => string 'Ñ' (length=1)
  39.       3 => string 'N' (length=1)
  40.       6 => string 'P' (length=1)
  41.     array (size=5)
  42.       1 => string 'A' (length=1)
  43.       0 => string 'B' (length=1)
  44.       3 => string 'N' (length=1)
  45.       2 => string 'Ñ' (length=1)
  46.       6 => string 'P' (length=1)
  47.     */
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 16/06/2014, 05:41
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Respuesta: Problemas con la letra Ñ

Gracias por el código. La verdad es que aunque veo lo que hace hay varias funciones que desconocía y he tenido que mirar que hacen. Alguna susituye a varias lineas de código que hice.

Pero sigo sin saber que hace exactamente var_dump y veo que no entiendo como funciona uasort, que es una función que no conozco. Veo lo que hace pero no entiendo como funciona la comparación, de donde salen los valores $val1 y $val2 y como ordena según el resultado.

Por otro lado, aunque me ordenara bien la Ñ, ¿no tendría problemas igualmente para mostrar el caracter?
__________________
La imaginación es más importante que el saber. - Einstein
  #4 (permalink)  
Antiguo 16/06/2014, 10:59
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problemas con la letra Ñ

var_dump es similar a print_r, es una funcion de salida como echo o print, la diferencia esta en que en vez de mostrar la variable "pelada" te muestra todos los detalles, como en este caso es un array, te muestra todos los valores del array. Es para simplificar la muestra.

uasort Lo que hace es ordenar un array pero pidiendote a vos que definas el criterio de ordenamiento, puedes poner este codigo para que te des una idea de lo que hace:

Código PHP:
Ver original
  1. uasort( $indices
  2.             , function($val1, $val2)
  3.                 {
  4.                     echo("Entran '$val1', '$val2' \t");
  5.                     $val1 = str_replace("Ñ", "NN", strtr($val1,"ÀÈÌÒÙÁÉÍÓÚÄËÏÖÜ","AEIOUAEIOUAEIOU"));
  6.                     $val2 = str_replace("Ñ", "NN", strtr($val2,"ÀÈÌÒÙÁÉÍÓÚÄËÏÖÜ","AEIOUAEIOUAEIOU"));
  7.                     echo("-> '$val1', '$val2' \t".(strcasecmp($val1, $val2) > 0 ? "1º '$val1' y 2º '$val2'" : (strcasecmp($val1, $val2) ? "1º '$val2' y 2º '$val1'" : "'$val1' y '$val2' van en la misma posicion")));
  8.                     return strcasecmp($val1, $val2);
  9.                 }
  10.           );

cuando lo probaste y viste el resultado, ¿Tubiste problemas para mostrar la Ñ? en cualquier caso, eso se puede resolver con las funciones utf8_encode/utf8_decode si es que surge el inconveniente.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 18/06/2014, 04:59
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Respuesta: Problemas con la letra Ñ

El problema en el código que me pusiste es el mismo que hay en elque hice yo: de cualquier palabra si tomo el primer caracter me sale tal cual pero en el caso de la Ñ, para que me salga el caracter tengo que pedirle los dos primeros caracteres.

Así substr(Elefante,0,1) me dará el caracter E pero substr(Ñoco,0,1) no me da el caracter Ñ. Para que me dé el caracter Ñ necesito hacer substr(Ñoco,0,2). Ese es el problema.

Por otro lado a lo que me refería es que aunque entiendo como debería funcionar el código lo que no entiendo es como se usa un function sin darle nombre a la función y si haber definido la variable antes: function($val1, $val2) ¿Donde se le indica los valores que toman $val1 y $val2?
__________________
La imaginación es más importante que el saber. - Einstein
  #6 (permalink)  
Antiguo 18/06/2014, 08:59
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Problemas con la letra Ñ

Utf-8 usa 8 bits para almacenar los caracteres ASCII, pero también 2, 3 incluso 4 bits para guarda muchos otros caracteres raros como tildes, la ñ, letras chinas, japonesas, arábigas, etc.

Substr solo vale para cadenas ASCCI de caracteres de 8 bits. Para hacer operaciones con cadenas codificadas en utf, se usa mb_XXXXXX que es la misma operación XXXX original, pero en cadenas Multi-Bytes (de ahí el mb_).
  #7 (permalink)  
Antiguo 18/06/2014, 09:15
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problemas con la letra Ñ

Es una funcion anonima, por eso no lleva nombre, se usa como metodo de evaluacion y lleva 2 parametros porque uasort la llama con dos parametros.

¿Podrias leer el manual por favor? Alli esta muy bien explicado ambos temas.

En javascript le puedes pasar una funcion sin nombre como parametro a otra, es muy probable que lo hallas hecho alguna vez y lo conozcas con el nombre de callback, si usaste JQuery en algun proyecto, sin duda tuviste que recurrir a esta técnica, en php es exactamente el mismo concepto.

Cita:
Así substr(Elefante,0,1) me dará el caracter E pero substr(Ñoco,0,1) no me da el caracter Ñ
¿Como que no? ¿Y que te da? ¿Manzanas?
Código PHP:
Ver original
  1. echo(substr("Ñoco",0,1));
  2.     echo(substr("ñoco",0,1));
  3.     echo(substr("elefante",0,1));
  4.     echo(substr("Elefante",0,1));

Produce como salida ÑñeE por lo cual esta perfecto.

Hasta este código funciona:
Código PHP:
Ver original
  1. $a = "Ñoco";
  2.     $b = "ñoco";
  3.     $c = "elefante";
  4.     $d = "Elefante";
  5.     echo($a[0]);
  6.     echo($b[0]);
  7.     echo($c[0]);
  8.     echo($d[0]);

que a priori podria no funcionar si no esta en ISO-8859-1 ya que la Ñ pertenece al conjunto ascii extendido y por lo tanto se representaria con 2 bytes y no con 1 internamente, sin embargo no falla y funciona bien.

Edito: posiblemente estes codificando el archivo como utf8/utf8 sin bom, si prestas atencion al primer codigo te hice un comentario que decia:
Cita:
// Codificado en ansi.
asi que debes codificar tu archivo en ese formato.

Edito2: si necesitas codificar en utf8 si o si, podrias revisar la seccion de iconv del manual, y mirar estos dos ejemplos:

Código PHP:
Ver original
  1. // Codificado en ansi:
  2.     $ansi = "Ñoco";
  3.     echo(substr($ansi,0,1)); // Ñ
  4.    
  5.     // Codificado en UTF-8    
  6.     $utf8 = "Ñoco";
  7.     echo(iconv_substr($utf8, 0, 1, "UTF-8")); // Ñ
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 18/06/2014 a las 09:35
  #8 (permalink)  
Antiguo 18/06/2014, 17:10
Avatar de arcanisgk122  
Fecha de Ingreso: junio-2010
Mensajes: 755
Antigüedad: 14 años, 5 meses
Puntos: 28
Respuesta: Problemas con la letra Ñ

aqui esta la solucion :

http://www.forosdelweb.com/f18/probl...4/#post4608796
__________________
Cooler Master Gladiator 600 - AMD PHENOM II X4 955 @ 3.5GHZ
GA-MA78GM-US2H - Super Talent 800 2GB x 2 Dual, (Unganged)
PSU Cooler Master eXtreme Power Plus 500W - Saphire R7-260OC-2GB
  #9 (permalink)  
Antiguo 23/06/2014, 04:09
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Respuesta: Problemas con la letra Ñ

Si NSD, efectivamente se me pasó por alto la linea donde ponía Codificado en ANSI. Y el problema me viene del post al que me señala arcanisgk122 Hasta ahora siempre tenía los documentos en ANSI y tenía que poner las etiquetas acutes en el HTML pero en algunas ocasiones veía que podía poner las tildes y salian bien. Ahora que estoy empezando a trabajar con el UTF-8 es cuando tengo los problemas.

arcanisgk122 Ahora mismo tengo la base de datos en utf8_unicode_ci, las tablas y los campos en utf8_general_ci pero el problema es el mismo, si tomo solo el primer caracter de la cadena no me da el caracter Ñ.

Usando iconv_substr consigo que en la lista de letras aparezca la Ñ pero al realizar la busqueda en la base de datos el resultado que me da es el correspondiente a la letra N, incluyendo las que empiezan con Ñ. A efectos interpreta la Ñ como una N.
__________________
La imaginación es más importante que el saber. - Einstein

Etiquetas: letra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:52.