Encoding issues posting from Android app to Nodejs server, plusses for spaces after decode?

I'm new to encoding issues and I'm not sure if what I'm doing is incorrect or I need to work around the results I get.

In my android app, lets say someone adds some text "3 Ë Æ Œ Ø Ī"

Before uploading this to my node server in a multipart form post, I do the following:

    textOneUTF = URLEncoder.encode(textFieldText, "UTF-8");

I log them out and here's what the text looks like pre & post encode:

BEFORE ENCODE: 3 Ë Æ Œ Ø Ī
3+%C3%8B+%C3%86+%C5%92+%C3%98+%C4%AA

That's posted to my node server.

On the server, I do:

 if(req.body.textone) {
  textOne = decodeURIComponent(req.body.textone);
 }

(I also tried decodeURI.)

But everything is coming out with spaces as plusses, e.g.:

Œ+Ü+È+Æ+M+Ū

  • so the special characters are ok, but what's with the plusses for spaces?

I don't want to manually replace "+" with a " " without trying to understand if there is a better method or other problems I could encounter?

** EDIT: **

I'm trying to see if I can deal with this, experimenting in firebug console.

>>> boop = "%2B%2B%C3%86%40%23%C2%A3%25%26+%C5%92SS%C3%83%2B++%2B++++%2B%23%C5%92";

"%2B%2B%C3%86%40%23%C2%A3%25%26+%C5%92SS%C3%83%2B++%2B++++%2B%23%C5%92"

>>> boop.replace(/\+%2B/g," " );

"%2B%2B%C3%86%40%23%C2%A3%25%26+%C5%92SS%C3%83%2B+ +++ %23%C5%92"

>>> console.log(decodeURIComponent(boop));

++Æ@#£%&+ŒSSÃ+++++++++#Œ

...you can't string replace the +%2B spaces first and then decode the rest of the string, and you can't do the decode first either. Any suggestions?

** /END EDIT **

** EDIT 2**

For now I'm solving this with this function:

function decodeTextSring(text) {

  var textfinished = "";
if(text.indexOf("+") != -1) {
  textSplit = text.split("+");

  for(i=0; i < textSplit.length; i++) {
    if(textSplit[i+1] != null) {
    textfinished += decodeURIComponent(textSplit[i]) + " ";
  }
  else {
    textfinished += decodeURIComponent(textSplit[i]);
  }
  }
}
else {
  textfinished = decodeURIComponent(text);
}

return textfinished;


}
  • so split on the +'s the java encode adds, decode each bit of the string, and reassemble with spaces if there are any.

* END EDIT 2

Using the + characters for the spaces is just a short hand notation for the spaces which otherwise would be encoded as %20. This is the only short hand notation I know of and oddly enough there is no direct method to revert your encoded URI component, but you can achieve such thing with:

decodeURI(text.split('+').join('%20'))

For decodeURI('3+%C3%8B+%C3%86+%C5%92+%C3%98+%C4%AA'.split('+').join('%20')) the result is 3 Ë Æ Œ Ø Ī; which I'm assuming is what you are looking for.