how different browsers handle these filenames: [👌.html] [lorem"ipsum.html ] [lorem\"ipsum.html ] [∭.triple.integral] [_a_∭_.txt] (_a_👌_.txt) [_"_%_%2_%22_%2f_%25_.txt] (_"_%_%2_"_%_.txt) [_\"_%_%2_%22_%2f_%25_.txt] (_\"_%_%2_"_%_.txt) [abc !"#$%&'()*+,-.x0123456789:;<=>?@ABC[\]^_`{|}~ ´µ¶·¸¹º»¿⌐¬½¼¡«»░▒▓│─█.txt] [aabbcc !!""##$$%%&&''(())**++,,--..xx00112233445566778899::;;<<==>>??@@AABBCC[[\\]]^^__``{{||}}~~ ´´µµ¶¶··¸¸¹¹ºº»»¿¿⌐⌐¬¬½½¼¼¡¡««»»░░▒▒▓▓││──██..ttxxtt] lines starting with "saved file:" is how php7.2.18 decodes it curl: escapes " into \" escapes \" into \\\" actually doesn't suck chrome/safari: escapes " into %22 does not escape \ does not escape %xx so %22 is unmodified (decodes as ") does not escape x; so a is unmodified (decodes as a) firefox: escapes " into \" however \" becomes \\" so php and most other parsers fail also does not escape x; or %xx just like chrome/safari ie7: wins by default since windows filenames can't contain " conclusion: always set pretend the mythical filename* does not exist (it doesn't) if /AppleWebKit/: simple replace from %22 to " else: if filename contains \\\" or (\\ and not \\"): proper unescape \\ and \" else: simple replace \" to " firefox 66.0.5 linux, no encoding on the html with the