javascripturisapui5uriencoding

"%" is getting URI decoded while everyhting else not


I have a strange UI5 problem. I create a string from a control's binding context which looks like:

Entity('Element%3AInfo%2CID')

Just for info, it looks like this decoded: Entity('Element:Info,ID')

However, I get this String from the following method chain:

oItem.getBindingContext().getPath().substr(1)

So, the whole (pretty basic) "navigate to" block looks like this:

showElement : function (oItem) {
    'use strict';

    var bReplace = jQuery.device.is.phone ? false : true;

    sap.ui.core.UIComponent.getRouterFor(this).navTo("element", {
        from: "master",
        element: oItem.getBindingContext().getPath().substr(1),
        otherpattern: "something"
    }, bReplace);
},

A console log in this block console.log(oItem.getBindingContext().getPath().substr(1)); provides the right string.

Console output of console.log(oItem.getBindingContext().getPath().substr(1)): Entity('Element%3AInfo%2CID')

The problem is (be aware, this is getting curious) that my URL pattern "{element}" is filled with:

Entity('Element%253AInfo%252CID')

Decoded: Entity('Element%3AInfo%2CID')

As you probably already know, the pattern's "%" is encoded. I don't get why UI5 would do this.

You should also know these facts which I've tested:

Is this a bug? I mean the URI pattern is left untouched as long as it doesn't come to a "%". For some odd reason this special character is encoded while everything else doesn't matter.


Solution

  • Its not exactly like "%" is getting encoded and everything else is not encoded.

    I also came across this issue. SAPUI5 does encoding once, and browser does it second time. Hence in the second iteration you will have only "%" to be encoded.

    Initial string : Element:Info,ID

    after first iteration of encoding(by UI5 framework) encodeURIComponent('Element:Info,ID') : We get Element%3AInfo%2CID

    So for the second iteration, only % is left to be encoded Element%253AInfo%252CID hence we get this.

    So if you are picking up the binding context from URL, you need to decode twice. Else as you are doing once is fine.