Ile to razy potrzebujemy przesłać np. GET'em (np. w pasku adresu) dane, które zawierają "dzwine" znaki ?

W takiej formie nie jesteśmy w stanie tego zrobić. Przykładem mogą być wysublimowane żądania w aplikacjach REST, w których to nie chcemy jawnie przesyłać takich niepożądanych znaków.

W przykładzie tym pokażę szybki i dobrze znany sposób na "bezpieczny" URL. Musimy jednak pamiętać, że base64 daje bardzo duży narzut kodu i dla żądań GET może się okazać za ogromny, lecz dla mniejszych przypadków nadaje się w 100% a przy tym fajnie działa.

Dla przesyłania dużych ilości danych zawsze używaj metody POST. Metody GET używaj do przesyłania parametrów kontrolnych stanu aplikacji.

Jeśli masz do przekazania dużą ilość danych to w formularzu umieść atrybut enctype i ustaw

...
<form enctype="multipart/form-data">...</form>

...oznacza to tylko tyle co z wolnego tłumaczenia tego atrybutu, mianowicie jeśli treści będzie odpowiednio duża ilość to zostanie ona podzielona na segmenty, wysłana do serwera a na końcu złożona w całość i zaprezentowana w superglobalnej tablicy $_POST

Kod klasy safe_base64

<?php

class safe_base64
{
    public static $decoded_signs = Array("+", "/", "-", "=");
    public static $encoded_signs = Array("__P__", "__S__", "__M__", "__E__");
    
    public static function encode($string)
    {
        return str_replace(static::$decoded_signs, static::$encoded_signs, base64_encode($string));
    }
    
    public function decode($encoded_string)
    {
        return base64_decode(str_replace(static::$encoded_signs, static::$decoded_signs, $encoded_string));
    }
}


?>

Przykład użycia klasy safe_base64

<?php

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean pretium interdum nulla, 
vel commodo est mattis sed. Nam ut dictum massa, quis semper enim. Integer eros justo, vehicula in sapien at, 
eleifend aliquet nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas";

$encoded = safe_base64::encode($string);
$decoded = safe_base64::decode($encoded);

echo "<p>Po kodowaniu: znakow <em>".strlen($encoded)."</em></p>";
print_r($encoded);

echo "<hr />";

echo "<p>Po rozkodowaniu: znakow <em>".strlen($decoded)."</em></p>";
print_r($decoded);

?>

...a jeśli ten sposób jest jednak za ciężki proponuję użyć metody POST

Jeśli wersja Twojego parsera PHP jest mniejsza od 5.3 zamiast static:: użyj self::. Sprawdzenie wersji zawsze po uruchomieniu funkcji phpinfo();