Base64 vs. URL Encoding: Different Problems, Different Tools
Base64 encoding makes arbitrary binary data safe for any text-only channel by re-encoding it into a restricted set of 64 characters; URL (percent) encoding instead makes specific text characters — spaces, symbols, non-English characters — safe specifically within a URL's structure, by converting just the problematic characters into a percent-sign-prefixed code while leaving the rest of the text untouched; they solve related but genuinely distinct compatibility problems and aren't interchangeable.
Both convert something "unsafe" for a specific context into something safe, which is why they're easy to conflate, despite operating quite differently.
What each one is actually protecting
Base64 protects against a text channel misinterpreting binary data as something other than plain content; URL encoding protects against a URL's own structural characters (like &, ?, and #, which have special meaning within a URL) being confused with the actual data you're trying to include as part of the URL.
Why you sometimes need both together
If you need to embed Base64-encoded binary data inside a URL (as a query parameter, for example), you typically need to apply URL encoding to the Base64 output afterward, since some Base64 characters (like + and /) themselves have special meaning within a URL and would need percent-encoding to be included safely.