2013-03-21 12 views
6

Mam url podobnyHTTP GET parametr url bez automatycznego dekodowania z wykorzystaniem PHP

test.php?x=hello+world&y=%00h%00e%00l%00l%00o 

kiedy piszę go złożyć

file_put_contents('x.txt', $_GET['x']); // -->hello world 
file_put_contents('y.txt', $_GET['y']); // -->\0h\0e\0l\0l\0o 

ale muszę napisać go bez kodowania

file_put_contents('x.txt', ????); // -->hello+world 
file_put_contents('y.txt', ????); // -->%00h%00e%00l%00l%00o 

jak mogę zrobić?

Dzięki

Odpowiedz

4

Ponieważ The $_GET i $_REQUEST Superglobale są automatycznie uruchamiane przez funkcję dekodowania (odpowiednik urldecode()), wystarczy ponownie urlencode() dane, aby uzyskać to, aby dopasować znaki przekazywane w adresie URL :

file_put_contents('x.txt', urlencode($_GET['x'])); // -->hello+world 
file_put_contents('y.txt', urlencode($_GET['y'])); // -->%00h%00e%00l%00l%00o 

Testowałem to lokalnie i działa idealnie. Jednak z twoich komentarzy możesz również przyjrzeć się swoim ustawieniom kodowania. Jeśli wynik urlencode($_GET['y']) jest %5C0h%5C0e%5C0l%5C0l%5C0o potem okazuje się, że null character że jesteś przejazdem w (%00) jest interpretowana jako dosłownego łańcucha "\0" (jak \ charakterze połączonego z 0 charakteru) zamiast prawidłowej interpretacji \0 jako pojedyncza pusty znak.

Powinieneś rzucić okiem na PHP documentation on string encoding and ASCII device control characters.

+0

nie działa. zwraca x -> hello + świat, y ->% 5C0h% 5C0e% 5C0l% 5C0l% 5C0o – user1725661

+0

@ user1725661 - Potem dzieje się coś jeszcze. Właśnie to przetestowałem i działa dobrze ... zobacz moją rozszerzoną odpowiedź. –

0

Myślę, że można użyć wartości urlencode(), aby przekazać wartość w adresie URL i urldecode(), aby uzyskać wartość.

+0

nie działa. zwraca x -> hello + świat, y ->% 5C0h% 5C0e% 5C0l% 5C0l% 5C0o – user1725661

3

Możesz uzyskać wartości nie kodowane ze zmiennej $ _SERVER ["QUERY_STRING"].

function getNonDecodedParameters() { 
    $a = array(); 
    foreach (explode ("&", $_SERVER["QUERY_STRING"]) as $q) { 
    $p = explode ('=', $q, 2); 
    $a[$p[0]] = isset ($p[1]) ? $p[1] : ''; 
    } 
    return $a; 
} 

$input = getNonDecodedParameters(); 
file_put_contents('x.txt', $input['x']); 
+0

To jest właściwa odpowiedź, ponieważ ponowne kodowanie zaproponowane przez Ben D. traktuje różne postacie (jak ukośniki) inaczej. –