I think pretty clean actually. It reads, and you said that it works correctly. As long as the implementation is hidden from the consumer, I would not worry about squeezing the latest improvement.
If you do this operation excessively (for example, hundreds of executions for each event), I would think of doing an implementation from UrlEncode / UrlDecode and passing them to each other in order to get better performance there, removing the need for line splitting / joining, but testing would have to prove it anyway and definitely would not be "clean" :-)
source share