2010-07-22 5 views

Respuesta

2

Normalmente este sería el método urldecode, pero no se aplica a los caracteres Unicode, como la suya. Prueba este lugar:

function unicode_urldecode($url) 
{ 
    preg_match_all('/%u([[:alnum:]]{4})/', $url, $a); 

    foreach ($a[1] as $uniord) 
    { 
     $utf = '&#x' . $uniord . ';'; 
     $url = str_replace('%u'.$uniord, $utf, $url); 
    } 

    return urldecode($url); 
} 
+3

Aquí hay varias cosas incorrectas ... Sustituye% uXXXX en lugar de \ uXXXX, reemplaza las secuencias por entidades (lo cual estaría bien para mostrar la cadena, excepto que ahora debes decirle a htmlspecialchars que no codifique doblemente la cadena y por supuesto, ahora no distingue entittas html que están originalmente en la cadena para las generadas); finalmente llama a urldecode que no tiene nada que ver con la pregunta: la codificación url codifica bytes (el valor máximo es% FF) y ciertamente no decodifica las entidades html que acaba de crear. – Artefacto

6

Convertir en UTF-8, hacer:

preg_replace('/\\\\u([0-9a-f]{4})/ie', 
    'mb_convert_encoding("&#x$1;", "UTF-8", "HTML-ENTITIES")', 
    $string); 

ya que es el escape que utilizan en JSON, otra opción sería json_decode. Esto, sin embargo, también requeriría el escape de comillas dobles y barras diagonales anteriores (excepto las de las secuencias de escape \uXXXX) y la adición de comillas dobles alrededor de la cadena. Sin embargo, si la cadena está codificada en JSON y eso es lo que originalmente motivó la pregunta, la respuesta correcta sería, naturalmente, usar json_decode en lugar del método anterior.

Cuestiones relacionadas