29

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

4 Answers 4

19

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

Sign up to request clarification or add additional context in comments.

7 Comments

like i said the problem that the definitions are different - but the implementations can be similar... -still didnt get an answer....:)
the implementations can be similar ? It has different purposes that are described in definitions.
I can use also base64 to transfer userid=1 and also encodeURIComponent ... im looking for the difference.
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.
@lucideer 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.
|
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.

1 Comment

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 limited
1

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.

Comments

0

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.

3 Comments

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.
Base64 works only with ASCII and encodeURIComponent does work with unicode. Try it in your browser: window.btoa('✓ à la mode');
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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.