urldecode("%ce%b7") creates η encoded in UTF-8. If you are viewing the output using some other encoding, you can see something else.
On the other hand, when you decode %26%23951%3B , it is true that you do not get η; you get η , which is the HTML entity code for η. To decode entity entities, use html_entity_decode :
echo html_entity_decode('η', false, 'UTF-8'); // prints η, encoded in UTF-8
source share