无法从URL

时间:2019-01-16 22:23:13

标签: javascript

我只是试图从URL解码一个变量,但是从变量中读取变量就没用了。

当前网址为: http://localhost:2531/members.aspx?Mcat=1&searchType=fname&fname=%u0645%u06cc%u0631%u0632%u0627

        //this function
        function SetSearchItems() {
            try {
                var WinLOC = String(window.location.toString());
                WinLOC = WinLOC.replace(/%/g, '\\');
                var fname = String(getParameterByName("fname", (WinLOC)));

                //i want see decoded text for fname variable...       
                alert(decodeURIComponent(fname));
            }
            catch (err) {
                alert(err);
            }
        }


    function getParameterByName(name, url) {
        if (!url) url = window.location.href;
        name = name.replace(/[\[\]]/g, "\\$&");
        var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
            results = regex.exec(url);
        if (!results) return null;
        if (!results[2]) return '';
        return decodeURIComponent(encodeURI(results[2].replace(/\+/g, " ")));
    }

正如我在代码中提到的,我想查看显示的[fname]变量已解码,但它显示:\ u0645 \ u06cc \ u0631 \ u0632 \ u0627 但这不希望我要解码...

2 个答案:

答案 0 :(得分:1)

首先,不要编写自己的URL解析器:使用URL()(内置的规范URL操作API),它将使您自动解析其URLSearchParams

parsed = new URL("http://localhost:2531/members.aspx?Mcat=1&searchType=fname&fname=%u0645%u06cc%u0631%u0632%u0627")

parsed.searchParams.get("fname")
// returns "%u0645%u06cc%u0631%u0632%u0627"

decodeURIComponent(u.searchParams.get("searchType"))
// returns "fname"

decodeURIComponent(parsed.searchParams.get("fname"));
// Uncaught URIError: URI malformed

您的字符串未采用与decodeURIComponent()兼容的方式进行编码,看起来像escape()生成的那样,无法正常工作:

decodeURIComponent(escape("میرزا"))
// Uncaught URIError: URI malformed

您改为使用encodeURICompoenent()

decodeURIComponent(encodeURIComponent("میرزا"))
// "میرزا"

因此,很明显,生成文本"%u0645%u06cc%u0631%u0632%u0627"所做的任何操作都是不正确的,您需要使用任何会生成URI组件(类似于"%D9%85%DB%8C%D8%B1%D8%B2%D8%A7")的方法。 (也许这不是JavaScript,也未在问题中指定。)

答案 1 :(得分:-1)

我找到了解决方案,url具有unicode值,我只需要将其从unicode转换为普通文本,因此在这种情况下,decodeURIComponent确实可以工作。

通过此功能,“ \ u0645 \ u06cc \ u0631 \ u0632 \ u0627”可以转换为普通文本。

    function unicodeToChar(text) {
        return text.replace(/\\u[\dA-F]{4}/gi,
               function (match) {
                   return String.fromCharCode(parseInt(match.replace(/\\u/g, ''), 16));
               });
    }

感谢https://stackoverflow.com/users/1497100/bryan-rayner