The encoder escapes every character that is not an unreserved URL character. Use it on one component, such as a query value, not on a full URL you want to keep readable.
The decoder rejects a % that is not followed by two hex digits. A plus sign is left as a plus sign. It is not treated as a space, because that convention belongs to HTML forms, not to percent-encoding.