Could it be possible to encode URI only for the Atom feed, not in the whole app? The JSON-LD spec (on which ActivityPub is built) says that every URI actually is an IRI, meaning it should be able to contain any Unicode character (with very few exceptions), so I don’t know how percent-encoded strings are treated…
And... actually, Atom also uses IRI. Its spec says:
4.2.6. The “atom:id” Element
Its content MUST be an IRI, as defined by [RFC3987].
This is the reason why I reverted all the code around percent-encoding. I don’t know why W3C feed validator claims IRIs are errors. But, how about deploying IRI version of Atom and convert them to URI if someone reports issue about specified feed reader implementation?