Javascript UTF-8编码:Unescape(%e2%80%93)返回â;而不是–;

Javascript UTF-8编码:Unescape(%e2%80%93)返回â;而不是–;,javascript,encoding,utf-8,escaping,uri,Javascript,Encoding,Utf 8,Escaping,Uri,我有一个搜索页面,其中有一个可以搜索的数据库名称下拉列表。选择数据库后,将在查询字符串中使用该名称以获取搜索结果。然后,我有一个保存搜索的函数,它只需要获取当前URL的查询字符串并将其保存到数据库中。但是,我的一个数据库名称出现了问题,因为连字符编码不正确 数据库名称为“马萨诸塞州巴恩斯塔布尔:遗嘱认证记录1685–1789”。生成的查询字符串为 ?database=Barnstable%2C%20MA%3A%20Probate%20Records%201685–1789 这很好,查询字符串会

我有一个搜索页面,其中有一个可以搜索的数据库名称下拉列表。选择数据库后,将在查询字符串中使用该名称以获取搜索结果。然后,我有一个保存搜索的函数,它只需要获取当前URL的查询字符串并将其保存到数据库中。但是,我的一个数据库名称出现了问题,因为连字符编码不正确

数据库名称为“马萨诸塞州巴恩斯塔布尔:遗嘱认证记录1685–1789”。生成的查询字符串为

?database=Barnstable%2C%20MA%3A%20Probate%20Records%201685–1789
这很好,查询字符串会得到我需要的结果。但当我使用“window.location.search”获取当前查询字符串时,连字符会变成UTF-8编码“%e2%80%93”。这是我的保存函数:

function SaveSearch(query, url) {
    var title = $("#save-name").val();
    query = removeParam("page", query);
    if (title) {
        $.ajax({
            url: url,
            type: 'post',
            success: function (info) {
                console.log("INFO: ");
                console.log(info);
                if (info == "Success") {
                    // change icon
                    $('#name-search').hide();
                    $('#save-name').val('');
                    $("#search-saved").show();
                } else {
                    $("#not-logged-in").show();
                }
            },
            error: function (info) {
                $("#error").show();
            },
            data: { queryParams: query, title: title }
        });
    }
}
当我调试它时,如果我在一开始就将“query”悬停,它会显示为

database=Barnstable%2C%20MA%3A%20Probate%20Records%201685%e2%80%931789
尽管我没有改变任何编码,页面顶部的url中有一个连字符。所以它在我的数据库中以%e2%80%93结束

尝试加载此搜索时出现问题:

 $.ajax({
    url: url,
    type: 'get',
    async: true,
    dataType: 'json',
    success: function (data) {
        for (var i = 0; i < data.length; i++) {
            var query = data[(data.length - (i + 1))].QueryParams;
            var params = (data[(data.length - (i + 1))].QueryParams).split("&");
            console.log(params);
            var paramDisplay = "";
            for (var j = 0; j < params.length; j++) {
                var param = params[j].split("=");
                var label = labelArray[param[0]];
                if (label != undefined) {
                    var paramString = label + ": " + unescape(param[1]);
                    paramDisplay += paramString;
                    if (j < params.length - 1) {
                        paramDisplay += "<br />";
                    }
                }
            }..........
$.ajax({
url:url,
键入:“get”,
async:true,
数据类型:“json”,
成功:功能(数据){
对于(变量i=0;i”;
}
}
}..........
unescape(param[1])返回“马萨诸塞州巴恩斯塔布尔:遗嘱认证记录1685–1789”


然后,当我尝试执行此搜索时,它没有得到任何结果,因为名称中有错误的字符。

使用
decodeURIComponent
而不是
unescape

$('body').append(decodeURIComponent(“数据库=Barnstable%2C%20MA%3A%20proteate%20Records%201685%e2%80%931789”))。
追加(“
”)。 追加(decodeURIComponent(“Barnstable%2C%20MA%3A%20Probate%20Records%201685%e2%80%931789”))。 追加(“
”)。 追加(decodeURIComponent(“%e2%80%93”)

注意它给了你什么

具体而言,
%e2
作为单个字符是
“–”
,而
%80
%93
不是ISO-8859-1字符集中定义的字符

也就是说,您的UTF-8编码字符被处理为三个ISO-8859-1字符

unescape
不是正确使用的函数。请改用
decodeURIComponent

%e2%80%93
U+2013  –   e2 80 93    EN DASH

我甚至不知道ISO-8859-1中存在漏洞,我认为只有一个字符的解码很奇怪。我尝试将其更改为“URI格式错误”(尝试解码“Barnstable%2C%20MA%3A%20遗嘱认证%20记录%201685%e2%80%931789”