Я сделал простой тест:
<?php
$email = "some_email%40example.com";
var_dump($email);
var_dump(urldecode($email));
var_dump(rawurldecode($email));
(ожидаемый) вывод:
string (24) "some_email% 40example.com"
string (22) "some_email@example.com"
string (22) "some_email@example.com"
Таким образом, декодирование работает должным образом.
Может ли быть так, что вы смотрите на один пример, где то, что вы считаете %40
, на самом деле является чем-то другим, например, последовательностью, которая содержит символ Unicode, только выглядит как теВы ожидаете, но на самом деле отличается?