Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Elanti en 16 de Agosto 2015, 22:52

Título: Ejercicio PHP CU00821B codificación caracteres no muestra acentos tildes substr
Publicado por: Elanti en 16 de Agosto 2015, 22:52
Hola a todos:

La letra del ejercicio es la siguiente:
Citar
EJERCICIO

Crea el código PHP que cumpla con lo que se indica a continuación:

a) Declara una variable cuyo contenido sea la cadena "Didáctica y divulgación de la programación"

b) Usando la función substr extrae cada una de las palabras de la cadena anterior a una variable. Como tenemos 6 palabras, debes tener 6 variables con las subcadenas.

c) Usando la concatenación muestra por pantalla lo siguiente: <<Las palabras primera, tercera y sexta son: Didáctica, divulgación, programación>>

d) Usando strlen muestra por pantalla lo siguiente: <<La palabra primera es Didáctica y tiene 9 caracteres, la palabra tercera es divulgación y tiene 11 caracteres. La palabra sexta es programación y tiene 12 caracteres>>   

Y mi código:

Código: [Seleccionar]
<meta charset="UTF-8">
<?php 
$frase 
"Didáctica y divulgación de la programación";
$did substr($frase,0,9);
$y substr($frase,10,1);
$div substr($frase,12,11);
$de substr($frase,24,2);
$la substr($frase,27,2);
$pro substr($frase,30,12);
echo 
"Las palabras primera, tercera y sexta son: $did$div$pro <br/>";
echo 
"La palabra primera es $did y tiene ";
echo 
strlen($did);
echo 
" caracteres, la palabra tercera es $div y tiene ";
echo 
strlen($div);
echo 
" caracteres. La palabra sexta es $pro y tiene ";
echo 
strlen($pro);
echo 
" caracteres";
?>

A pesar de que tuve la precaución de incluir el <meta charset="UTF-8"> como lo hago siempre en HTML (aunque no sé si es lo apropiado en este caso), y a pesar de que tengo el Notepad++ configurado en UTF-8 sin BOM, no he conseguido que la letra "o" con acento se visualice bien (aunque sí se visualiza bien la "a" con acento). Me aparece en su lugar un signo de interrogación dentro de un rombo negro, y creo que esto también me está afectando el conteo de caracteres para las funciones substr() y strlen().  ¿Cómo lo soluciono?

Gracias.
Título: Re:Ejercicio php CU00821B . Dificultades con codificación de caracteres
Publicado por: SamML en 17 de Agosto 2015, 01:23
Código: [Seleccionar]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>

</head>
<body>
<?php 


$frase 
"Didáctica y divulgación de la programación";
$did substr($frase,0,10);

$div substr($frase,13,12);

$pro substr($frase,-13);
echo 
"Las palabras primera, tercera y sexta son: $did$div$pro <br/>";
echo 
"La palabra primera es $did y tiene ";
echo 
strlen($did)-1;
echo 
" caracteres, la palabra tercera es $div y tiene ";
echo 
strlen($div)-1;
echo 
" caracteres. La palabra sexta es $pro y tiene ";
echo 
strlen($pro)-1;
echo 
" caracteres";
?>

</body>
</html>

Los caracteres especiales y acentuados utilizan 2 posiciones del array que compone el string y por eso te daba fallo y no entiendes porque esta fallando si las longitudes que aplicas están bien.
Imagínate que cuando es un carácter especial o acentuado suma 2 en vez de 1 sería algo así:
Código: [Seleccionar]
0   1  2  3       4       5
[C, O, J, O, (acentuada), N]

PD: Sublime Text >> Notepad ++ :D
Título: Re:Ejercicio PHP CU00821B dificultad codificación de caracteres no muestra acentos
Publicado por: Elanti en 18 de Agosto 2015, 00:16
Bueno, gracias… aunque sigo sin saber cómo solucionar el problema, para que la "ó" se visualice bien en pantalla…
Título: Re:Ejercicio PHP CU00821B dificultad codificación de caracteres no muestra acentos
Publicado por: GonzaH en 18 de Agosto 2015, 02:01
Hola, deja así el código

Código: [Seleccionar]
<html>
   <head>
      <meta http-equiv="Content-type" content="text/html;charset=UFT-8">
   </head>
<body>
<?php 
$frase 
"Didáctica y divulgación de la programación";
$did substr($frase0,10);
$y substr($frase10,12);
$div substr($frase12,12);
$de substr($frase,24,2);
$la substr($frase,27,2);
$pro substr($frase,31,40);
echo 
"Las palabras primera, tercera y sexta son: $did$div$pro <br/>";
echo 
"La palabra primera es $did y tiene ";
echo 
strlen($did);
echo 
" caracteres, la palabra tercera es $div y tiene ";
echo 
strlen($div);
echo 
" caracteres. La palabra sexta es $pro y tiene ";
echo 
strlen($pro);
echo 
" caracteres";
echo 
"<br />";
echo 
$frase;
?>

</body>
</html>

¡Saludos!
Título: Re:Ejercicio PHP CU00821B dificultad codificación de caracteres no muestra acentos
Publicado por: Elanti en 18 de Agosto 2015, 05:11
No, con esa declaración es aún peor, porque me genera problemas también con la "a" acentuada, y no sólo con la "o".
He estado buscando en internet la solución a mi problema y no la he encontrado por el momento. Estoy practicando tanto en local como en remoto, y en los dos servidores tengo el mismo problema. He revisado la configuración de mi servidor local, y aparentemente está todo correcto.
Lo curioso es que el problema se me manifiesta exclusivamente con PHP. Los archivos HTML se me muestran correctamente con sus caracteres acentuados, tanto en el servidor local como en el remoto.
Título: Re:Ejercicio PHP CU00821B dificultad codificación de caracteres no muestra acentos
Publicado por: SamML en 18 de Agosto 2015, 11:57
Compañero, no es un problema de formato o de que no pueda mostrar caracteres acentuados si no un problema en el entendimiento de un string en si y el metodo substr. Tienes que ver los strings como si se trataran de un array, porque lo son internamente.
Y como te digo un caracter especial ocupa 2 posiciones de dicho array, y no una.

No obstante el código que te puse funciona bien, si no entiendes algo de ahí podemos comentarlo.

Como te dije un caracter con tilde ocupa dos posiciones, no una. Si mi cadena es simplemente.

cadena = "ó"

Y quiero mostrarla por el metodo substr haré, substr(0,2) no substr(0,1).

Si entiendes los metodos de codificación de caracteres te explico que tiene que ver en el tamaño de bytes que utiliza para almacenarl. Si un caracter normal ocupa 4 bytes un caracter acentuado ocupa 8 bytes, por ejemplo. Por eso te muestra el signo de interrogacion porque tomarias solo 4 bytes de tu letra con tilde que ocupa 8 y eso decodificado no sabe lo que es.

Saludos
Título: Re:Ejercicio PHP CU00821B dificultad codificación de caracteres no muestra acentos
Publicado por: Elanti en 18 de Agosto 2015, 12:55
SamML:
Acabo de probar tu código en mi servidor local, y ¡funciona perfectamente!
Ahora me tengo que ir, pero luego voy a tratar de ver por qué tu código funciona y el mío no.
¡¡Gracias!!
Título: Re:Ejercicio PHP CU00821B dificultad codificación de caracteres no muestra acentos
Publicado por: Elanti en 18 de Agosto 2015, 20:46
Indudablemente, tengo que agradecerle a SamML que me haya sacado de este atolladero.
Con el mayor de los respetos, y a manera de crítica constructiva, tengo que decir que lo que él me enseñó no está explicado en el texto, y sin esos conocimientos era imposible resolver el ejercicio. Otras personas que tengan el mismo problema en el futuro, podrán leer este hilo. En mi caso, la aparición de esos caracteres extraños me hizo pensar en algún problema de codificación de caracteres, y me llevó a revisar los archivos de configuración de los servidores y buscar soluciones para un problema inexistente. Cosas de la vida.
¡Saludos!