Кодируйте строку, затем декодируйте последовательность только для ~
. При желании вы можете определить константу, содержащую значение в кодировке URL для этого символа, и заменить ее.
define('TILDE_URLENCODE', urlencode('~')); // Or '%7E'
$url = str_replace(TILDE_URLENCODE, '~', urlencode($url));