#AYUDA# Me estoy volviendo loco. Php

Estado
No está abierto para más respuestas.

BotPress

Oro
Usuario de Bronce
Mensajes
1,056
Puntuación de reacción
0
Después de perder mi tiempo y mi orgullo postro esto como ultimo recurso...

Estoy cogiendo datos de una base de datos y tengo que sustituir todos las letras con acentos por letras sin acentos... El caso es que tanto en la base de datos como en el HTML me lo pinta con acento y no con códigos raros pero al intentar hacer un str_replace el php no me detecta, por ejemplo, la ó como una ó normal y corriente así que me es imposible reemplazarla.

Lo he intentado con el código ascii correspondiente y nada... Ya no se que hacer muchachos, por favor, ayuda

TapaTalk mola
 

BotPress

Oro
Usuario de Bronce
Mensajes
1,056
Puntuación de reacción
0
@lobogris te menciono por si sabes algo de a lo que me refiero

TapaTalk mola
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Yo también he pasado unos cuantos malos ratos con las codificaciones en PHP, y los seguiré pasando que es lo peor :sisi1:, pero bueno no hay nada irremediable, veamos:

1º Detecta la codificación de la cadena a modificar

PHP:
  $string = 'Una cadena cualquiera en Español con acentos á é í ó ú';
  $encoded_in = mb_detect_encoding( $string );

2º Ya tenemos el valor de codificación:

A) Supongamos que nos devuelve UTF8 :

- Pasamos la cadena a ISO-8859-1 para transformar cada letra a un byte y que reconozca los acentos como letras distintas
PHP:
$string = strtr( utf8_decode( $string ), utf8_decode( 'áéíóúñÁÉÍÓÚÑ' ), 'aeiounAEIOUN' );

B)Si nos devolviera ISO-8859-1 no deberíamos hacer nada, o eso creo...

C) Si nos devulve ASCII, podemos probar lo siguiente:
PHP:
$string = html_entity_decode( $string, ENT_QUOTES, 'UTF-8' );
Y después hacer el paso A

También puedes probar con `iconv` pero lo más probable es que te devuelva las letras con acentos rollo: así => as'i o as\i depende de como lo uses. Y sino puedes probar la función de Wordprss para pasar letras con acentos a ASCII https://core.trac.wordpress.org/browser/tags/3.8.1/src/wp-includes/formatting.php#L613

Saludos
 

BotPress

Oro
Usuario de Bronce
Mensajes
1,056
Puntuación de reacción
0
Yo también he pasado unos cuantos malos ratos con las codificaciones en PHP, y los seguiré pasando que es lo peor :sisi1:, pero bueno no hay nada irremediable, veamos:

1º Detecta la codificación de la cadena a modificar

PHP:
  $string = 'Una cadena cualquiera en Español con acentos á é í ó ú';
  $encoded_in = mb_detect_encoding( $string );

2º Ya tenemos el valor de codificación:

A) Supongamos que nos devuelve UTF8 :

- Pasamos la cadena a ISO-8859-1 para transformar cada letra a un byte y que reconozca los acentos como letras distintas
PHP:
$string = strtr( utf8_decode( $string ), utf8_decode( 'áéíóúñÁÉÍÓÚÑ' ), 'aeiounAEIOUN' );

B)Si nos devolviera ISO-8859-1 no deberíamos hacer nada, o eso creo...

C) Si nos devulve ASCII, podemos probar lo siguiente:
PHP:
$string = html_entity_decode( $string, ENT_QUOTES, 'UTF-8' );
Y después hacer el paso A

También puedes probar con `iconv` pero lo más probable es que te devuelva las letras con acentos rollo: así => as'i o as\i depende de como lo uses. Y sino puedes probar la función de Wordprss para pasar letras con acentos a ASCII https://core.trac.wordpress.org/browser/tags/3.8.1/src/wp-includes/formatting.php#L613

Saludos

Ojala sea eso! En cuanto tenga el PC lo pruebo. Mil gracias!!!

TapaTalk mola

- - - Actualización- - -
@lobogris, ahor estoy en el pc, vamos a ver que tal procede... ojala funcione

- - - Actualización- - -
@lobogris por lo que he podido comprobar, con lo que me has pasado, usando la opción (A) me cambia todos los acentos por interrogantes

- - - Actualización- - -
@Julio rodriguez sabes algo al respecto? tu que tambien sabes mucho!

- - - Actualización- - -
@Julio Rodríguez
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Ojala sea eso! En cuanto tenga el PC lo pruebo. Mil gracias!!!

TapaTalk mola

- - - Actualización- - -
@lobogris , ahor estoy en el pc, vamos a ver que tal procede... ojala funcione

- - - Actualización- - -
@lobogris por lo que he podido comprobar, con lo que me has pasado, usando la opción (A) me cambia todos los acentos por interrogantes

- - - Actualización- - -
@Julio rodriguez sabes algo al respecto? tu que tambien sabes mucho!

- - - Actualización- - -
@Julio Rodríguez
Si te mb_detect_encoding() te devuelve UTF8 es imposible que convierta los caracteres a interrogantes, en que tienes el texto codificado?
 

BotPress

Oro
Usuario de Bronce
Mensajes
1,056
Puntuación de reacción
0
si te mb_detect_encoding() te devuelve utf8 es imposible que convierta los caracteres a interrogantes, en que tienes el texto codificado?

utf-8

- - - Actualización- - -

El caso es que yo creo que las letras que veo como áéíóú en realidad no son letras, son una especie de simbolos y no se que cojjj hacer :S
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
utf-8

- - - Actualización- - -

El caso es que yo creo que las letras que veo como áéíóú en realidad no son letras, son una especie de simbolos y no se que cojjj hacer :S
¿Puedes pasarme una url donde muestres el texto en HTML? Sin convertirlo me refiero
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Espera que lo preparo y te envio mp en menos de 1 minuto

TapaTalk mola
Los string que me has mostrado están corruptos, o sea se han perdido caracteres y remplazado con � y por eso no te funciona. Asegúrate de scrapear el texto bien y codificarlo en UTF8 o no codificarlo y dejarlo en ISO-8859-1, y dile al navegador la codificación al mostrarlo
 

BotPress

Oro
Usuario de Bronce
Mensajes
1,056
Puntuación de reacción
0
@lobogris pues vaya, lo curioso es que se ve bien si no intento modificar nada
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
@lobogris pues vaya, lo curioso es que se ve bien si no intento modificar nada
A ver entonces no leíste bien, te dije que me mostraras la cadena SIN modificar en un documentpo HTML, modificada no me sirve de nada porque ya la has corrompido :dale2:
 
Mensajes
232
Puntuación de reacción
0
a ver yo al crear la DB y sus tablas siempre uso el mismo cotejamiento que es utf8_general_ci, y a la hora de acceder a la DB hazlo siempre con una codificación por defecto tanto para leer como para insertar

$MySqli = new mysqli('SERVIDOR','USUARIO','PASSWORD','DATABASE');

if ($MySqli->connect_errno) {
$emailerror = 'Fallo Conexion DB<br>'.$MySqli->connect_errno.'<br>'.$MySqli->connect_error;
}

AKI ES DONDE SE DEFINE EL TIPO DE CONEXIÓN
if (!$MySqli->set_charset("utf8")) {
$emailerror .= "<br>Error cargando el conjunto de caracteres utf8: ".$MySqli->error;
}

con ello y poniendo en la web siempre

<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />

dentro del HEAD no deberias tener problemas
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
@Shovi, ya está así de fácil y como te decía:

Me has pasado un texto que tiene entidades HTML, como esto:
HTML:
<p>Españoles por el Mundo ver más</p>

Lo tenemos que decodificar a UTF8 con html_entities, así:
PHP:
$string = html_entity_decode( $string, ENT_NOQUOTES, 'UTF-8' );

Después decodificamos el UTF8 y reemplazamos los caracteres que deseemos:
PHP:
$string = strtr( utf8_decode( $string ), utf8_decode( 'áéíóúñÁÉÍÓÚÑ' ), 'aeiounAEIOUN' );

Pruébalo:

PHP:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf8">
</head>
<body>
<?php

    $string = 'Españoles por el Mundo ver más';
    echo mb_detect_encoding( $string ) . ' --> ' . $string . '<br>';
    
    $string = html_entity_decode( $string, ENT_NOQUOTES, 'UTF-8' );
    echo mb_detect_encoding( $string ) . ' --> ' . $string . '<br>';
    
    $string = strtr( utf8_decode( $string ), utf8_decode( 'áéíóúñÁÉÍÓÚÑ' ), 'aeiounAEIOUN' );  
    echo mb_detect_encoding( $string ) . ' --> ' . $string . '<br>';

?>
</body>
</html>


El resultado será este :

HTML:
<!DOCTYPE HTML> <html> <head> <meta charset="utf8"> </head> <body> ASCII --> Españoles por el Mundo ver más<br>UTF-8 --> Españoles por el Mundo ver más<br>ASCII --> Espanoles por el Mundo ver mas<br></body> </html>

Aunque si no marcas el documento como utf8 la segunda cadena se mostrará en natural.

Función:

PHP:
    function strip_accents( $string ) {
    
        $encoded_in = mb_detect_encoding( $string );
    
        if( $encoded_in == 'ASCII' )
            return strtr( utf8_decode( html_entity_decode( $string, ENT_NOQUOTES, 'UTF-8' ) ), utf8_decode( 'áéíóúñÁÉÍÓÚÑ' ), 'aeiounAEIOUN' );
        elseif( $encoded_in == 'UTF-8' )
            return strtr( utf8_decode( $string ), utf8_decode( 'áéíóúñÁÉÍÓÚÑ' ), 'aeiounAEIOUN' );
        
        return false;
        
    }

PD: De todas formas he estado mirando y la función mb_detect_encoding es más profunda que esto, esto que digo te servirá, pero digamos que no está bien aplicada la práctica.
 
Mensajes
1
Puntuación de reacción
0
Sabes no as intentado usar <pre>INFORMACIÓN DE LA BASE DE DATOS </pre> puedes guardar elementos html en mysql y así cuando los imprima el programa te saldrán igual a como los guardaste funciona con espacios tambien. el colmo es que comento mas de un año después pero bueno espero a alguien le funcione :)
 
Estado
No está abierto para más respuestas.
Arriba