Так же как и кириллицу, и пробелы.
# это %23
Есть один нюанс, если вы кодируете полный путь к файлу, то нужно:
1) строку url разбить на составляющие пути по разделителю слеш;
2) каждую составляющую перекодировать функцией rawurlencode;
3) собрать обратно путь.
$in_str = 'files/test/Test! symbol # and % and & and (=-,.).pdf';
$out_str = implode('/', array_map('rawurlencode', explode('/', $in_str)));
file_put_contents('test_url.txt', $out_str);
// test_url.txt
// files/test/Test%21%20symbol%20%23%20and%20%25%20and%20%26%20and%20%28%3D-%2C.%29.pdf