I am having a similar problem. The url in question looks like:
Permitted URI chars is the default setting:
$config[‘permitted_uri_chars’] = ‘a-z 0-9~%.:_-’;
As you can see, I am making sure that the last argument is always treated with urlencode(). Whats bizarre is that by the time CI verifies the URI (Router.php, around line 128), the urlencode stuff has already been decoded. So the url gets ejected not because of the percent sign but because of the “(” evalutating to “(”.
So this may be the same problem as you have. The question remains why the urldecoding is automatic, because I didn’t call urldecode anywhere yet.