Honestly, I was mainly just repeating what @FileKraft reported.
In any case, I don't work around FMI bugs like that, but thanks. That's a FMP-only CF you'd need to add to any possible FMP app that would use GetAsUrlEncoded().
A slightly better multi-year FMP bug workaround might be to use base64Encode and then decode the "!" on the service side.
Then, in Java, python, or whatever modern language you choose...
IMHO, a better workaround would be for FMI to issue a point release after a multi-year bug, once discovered, the next day.