2010-07-22 5 views

Odpowiedz

2

Normalnie byłoby to metoda urldecode, ale to nie ma zastosowania do znaków Unicode, jak twoje. Spróbuj tego Zamiast:

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

Jest kilka rzeczy nie w porządku ... Zamiast tego zastępujesz% uXXXX zamiast \ uXXXX, zamieniaj sekwencje na encje (co byłoby w porządku dla wyświetlania ciągu znaków, ale teraz musisz powiedzieć htmlspecialchars, aby nie podwójnie kodować łańcucha znaków i oczywiście, teraz nie rozróżniasz html, które są pierwotnie w łańcuchu dla wygenerowanych); na koniec wywołujesz kod urldecode, który nie ma nic wspólnego z pytaniem - kodowanie URL-i koduje bajty (maksymalna wartość to% FF) i na pewno nie dekoduje utworzonych przez ciebie html. – Artefacto

6

przekonwertować na UTF-8, wykonaj następujące czynności:

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

ponieważ jest Cytowanie używany w JSON, innym rozwiązaniem byłoby json_decode. Wymagałoby to jednak również uniknięcia podwójnych cudzysłowów i odwrotnych ukośników przed (z wyjątkiem sekwencji ewakuacyjnych \uXXXX) i dodawania podwójnych cudzysłowów wokół napisu. Jeśli jednak ciąg jest rzeczywiście kodowany JSON i to było pierwotnie uzasadnione pytanie, poprawną odpowiedzią byłoby oczywiście użycie metody json_decode zamiast powyższej metody.