Foros del Web » Programando para Internet » PHP »

Caracteres Unicodes y PHP

Estas en el tema de Caracteres Unicodes y PHP en el foro de PHP en Foros del Web. Hola Comunidad, Les vengo a presentar un problema un tanto extraño. Sucede que tanto la función str_replace(), preg_replace_callback(), json_encode(), en un archivo PHP dentro de ...
  #1 (permalink)  
Antiguo 22/09/2015, 08:16
 
Fecha de Ingreso: septiembre-2015
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Pregunta Caracteres Unicodes y PHP

Hola Comunidad,

Les vengo a presentar un problema un tanto extraño.
Sucede que tanto la función str_replace(), preg_replace_callback(), json_encode(), en un archivo PHP dentro de un Wordpress, trunca la cadena en vez de hacer bien los reemplazos.

por ejemplo, esta es la cadena (json antes de aplicar un json_decode) que trae de Youtube:

Código:
$tmp = {"author_name": "Contranalisis Psiconeurociencia", "height": 356, "thumbnail_height": 360, "author_url": "https:\/\/www.youtube.com\/user\/potencialhumanotv", "width": 474, "thumbnail_url": "https:\/\/i.ytimg.com\/vi\/IyjWqRixa0U\/hqdefault.jpg", "type": "video", "html": "\u003ciframe width=\"474\" height=\"356\" src=\"https:\/\/www.youtube.com\/embed\/IyjWqRixa0U?feature=oembed\" frameborder=\"0\" allowfullscreen\u003e\u003c\/iframe\u003e", "thumbnail_width": 480, "provider_name": "YouTube", "title": "El Potencial Humano con Leonardo Stemberg (15 de Julio 2015)", "provider_url": "https:\/\/www.youtube.com\/", "version": "1.0"}
Si aplico esto:

Código:
$tmp = str_replace('\\u003e','>',$tmp);
$tmp = str_replace('\\u003c','<',$tmp);
La cadena queda truncada:

Código:
{"author_name": "Contranalisis Psiconeurociencia", "height": 356, "thumbnail_height": 360, "author_url": "https:\/\/www.youtube.com\/user\/potencialhumanotv", "width": 474, "thumbnail_url": "https:\/\/i.ytimg.com\/vi\/IyjWqRixa0U\/hqdefault.jpg", "type": "video", "html": "
Pero sólo pasa con el segundo reemplazo el que corresponde a \u003c.
Pero si en la cadena original meto un espacio entre el unicode y el iframe, así:

Código:
...\u003c iframe...
La sorpresa es que funciona bien.
Otro dato interesante es que en un php en mi local funciona bien, en todos los casos de todas las maneras, si lo meto en el index.php del Wordpress también funciona bien. Pero ya dentro de las clases de "media" del Wordpress tiene este comportamiento extraño.

Alguien se da una idea?
Muchas gracias!
  #2 (permalink)  
Antiguo 22/09/2015, 08:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 2 meses
Puntos: 2534
Respuesta: Caracteres Unicodes y PHP

En primer lugar esto es innecesario:

Código PHP:
Ver original
  1. $tmp = str_replace('\\u003e','>',$tmp);
  2. $tmp = str_replace('\\u003c','<',$tmp);

Es decir, las secuencias \uNNN son secuencias válidas para JSON, y es totalmente compatible con Unicode.

No necesitas reemplazar nada, esas secuencias no son errores.

Cita:
La cadena queda truncada:
No, no queda truncada.

¿De casualidad imprimes dicho JSON?

Seguramente tu navegador está interpretando ese fragmento de HTML como válido y como te fías únicamente de lo que veas a simples vista... pues, eso.

Ahora, ¿exactamente cual es el problema entonces?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 22/09/2015, 08:38
 
Fecha de Ingreso: septiembre-2015
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Pregunta Respuesta: Caracteres Unicodes y PHP

No, justamente eso es lo extraño. Json lo debería interpretar bien, srt_replace no es necesario, pero ni json lo interpreta ni str_replace funciona, la cadena queda truncada, eso claro, siempre viéndolo desde el código de fuente.

Alguna idea?
  #4 (permalink)  
Antiguo 22/09/2015, 08:39
 
Fecha de Ingreso: septiembre-2015
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Caracteres Unicodes y PHP

el problema es exactamente lo que planteé en el primer mensaje.
debería funcionar, en el index.php del Wordpress funciona, pero en otros archivos no, es muy extraño.
  #5 (permalink)  
Antiguo 22/09/2015, 08:50
 
Fecha de Ingreso: septiembre-2015
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Pregunta Respuesta: Caracteres Unicodes y PHP

He implementado también esta estrategia:

Código PHP:
$response_body '{"author_name": "Contranalisis Psiconeurociencia", "height": 356, "thumbnail_height": 360, "author_url": "https:\/\/www.youtube.com\/user\/potencialhumanotv", "width": 474, "thumbnail_url": "https:\/\/i.ytimg.com\/vi\/IyjWqRixa0U\/hqdefault.jpg", "type": "video", "html": "\u003ciframe width=\"474\" height=\"356\" src=\"https:\/\/www.youtube.com\/embed\/IyjWqRixa0U?feature=oembed\" frameborder=\"0\" allowfullscreen\u003e\u003c\/iframe\u003e", "thumbnail_width": 480, "provider_name": "YouTube", "title": "El Potencial Humano con Leonardo Stemberg (15 de Julio 2015)", "provider_url": "https:\/\/www.youtube.com\/", "version": "1.0"}'

function replace_unicode_escape_sequence($match) {
        return 
mb_convert_encoding(pack('H*'$match[1]), 'UTF-8''UCS-2BE');
    }
    
function 
replace_unicode_callback($str) {
        return 
preg_replace_callback('/\\\\u([0-9a-f]{4})/i''replace_unicode_escape_sequence'$str);
    }

echo 
replace_unicode_callback(trim$response_body ) ) 
Si a la función replace_unicode_escape_sequence() le hago un "echo" al mb_convert_encoding(), imprime muy bien los <>, pero el reamplazo al final no llega a hacerse. insisto que es muy extraño... a alguien le pasó alguna vez?
  #6 (permalink)  
Antiguo 22/09/2015, 09:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 2 meses
Puntos: 2534
Respuesta: Caracteres Unicodes y PHP

Cita:
Pero ya dentro de las clases de "media" del Wordpress tiene este comportamiento extraño.
¿Será que exista un plugin o filtro que modifique tus datos?

En todo caso creo que deberías visitar el sub-foro de Wordpress ya que tu problemática no es para nada general.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 22/09/2015, 09:47
 
Fecha de Ingreso: septiembre-2015
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Busqueda Respuesta: Caracteres Unicodes y PHP

Puede ser, aunque estoy ejecutando funciones nativas de PHP dentro de los archivos. Creo que no tiene que ver necesariamente con WoordPress.
En mis investigaciones estoy sospechando que tenga que ver con un bug de la versión 5.4.1 de php con los bufers, porque estoy viendo que dentro de los bufers se comporta así, pero fuera no. Si alguien ya sabe algo al respecto agradecería el aporte, y si no, cuando descubra del todo a qué se debe, lo comparto para otro que tenga el mismo problema.

Etiquetas: str_replace, unicode
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 20:06.