url-Encode vs Base64 encoding ( usages)?
Asked Answered
C

4

28

I was wondering...

(except the issue with the base64's plus'+' sign in query string - which is translated to 'space' and can be solved by %2b) :---> which is the preferred way to transfer data in query string?

Both functions can be used through the JS commands:

  • btoa
  • encodeUriComponent

so im asking myself(and you) :

when should I use what ? ( ive always used encodeUriCompoonent - by instinct).

the problem that the definitions are different - but the implementations can be similar...

edit

I think ive found the reason for asking.... ( and why nobody asked it before)

enter image description here

Clydesdale answered 22/4, 2012 at 11:36 Comment(0)
W
18

base64 is used to transfer binary data. (not supported in IE, cant encode spacial chars.)

encodeURIComponent only encodes special characters.

An interesting thing is that you can't apply base64 to unicode strings without encodeURIComponent: https://developer.mozilla.org/en/DOM/window.btoa

Windbag answered 22/4, 2012 at 11:46 Comment(7)
like i said the problem that the definitions are different - but the implementations can be similar... -still didnt get an answer....:)Clydesdale
the implementations can be similar ? It has different purposes that are described in definitions.Windbag
I can use also base64 to transfer userid=1 and also encodeURIComponent ... im looking for the difference.Clydesdale
Then no difference, really. But if you transfer Unicode data then you're obliged to use encodeURIComponent. And also base64 will take more space comparing to encodeURIComponent.Windbag
encodeURIComponent() will only take less space if you exclusively pass characters that won't be encoded (i.e. mostly alphanumeric) - anything actually encoded will take far more space than base64 would. e.g. btoa('::') becomes Ojo= whereas encodeURIComponent('::') becomes %3A%3A - and baloons upwards with greater character counts.Braise
@Braise in any case more general than btoa('::') you need to do a 'btoa(encodeURIComponent(realWorldString))' or else btoa won't work. The case you depict is one in which the input to '::' does not even have one character outside plain ASCII. Even U+0100 breaks. As soon as you desire encoding (i.e. more than ASCII), you need encodeURIComponent anyway and the sizes are added up and comparison does not make much sense.Syphilology
Your link is a dead linkElate
B
3

The answer to this is entirely dependent on your server-side application.

'+' is not translated to 'space' by the client - it is auto-translated to 'space' by some server-side apps, largely for backward-compatibility reasons (conversely, some server-side apps will leave '+' as '+' in compliance with RFC3986 ).

As far as the client is concerned - btoa() and encodeURIComponent() (and encodeURI() and escape()) just encode a string of text into different abstracted strings according to different encoding or escaping algorithms - btoa() usually produces the smallest resultant string using base64 encoding but meze's comment re: unicode is worth taking into account here.

The important thing to note is what your server-side application (some ASP.NET-based setup in your case) then uses to decode that string back to it's original form.

Braise answered 22/4, 2012 at 11:53 Comment(1)
Considering the necessity to use encodeURIComponent() for Unicode character > U+00FF anyway, the use case of btoa() and hence the suggested advantage of a smaller size, is very limitedSyphilology
B
0

I use Base64 encoding when I want to convert byte array into a string, with ability to convert it back to byte array later.

UrlEncoding when I want a string to be placed safely within url.

Bluecoat answered 26/8, 2022 at 8:41 Comment(0)
C
-1

fwiw, I use base64 whenever I want to transport anything that CAN be unicode, between a server and a client. urlencode doesn't handle all unicode charachters all that well. It quickly gets a mess with all the percentage signs.

so, in short: expecting unicode input/output, always base64 the transportation.

Chook answered 22/4, 2012 at 11:46 Comment(3)
I just saw the other answer by user meze. I don't know what he's talking about. I use base64 encoding exactly BECAUSE it handles unicode strings so well. Japanese, Chinese, Cyrillic input daily on a couple of my sites that gets transported this way.Chook
Base64 works only with ASCII and encodeURIComponent does work with unicode. Try it in your browser: window.btoa('✓ à la mode');Windbag
aha, well, I have no idea of what btoa does. when I was talking about base64, I meant it as a general thing. I use it from PHP myself to send stuff up to the client.Chook

© 2022 - 2024 — McMap. All rights reserved.