【问题标题】:UTF-8 encoding: Unescape(%e2%80%93) returns â instead of –UTF-8 编码: Unescape(%e2%80%93) 返回 â 而不是 –
【发布时间】:2015-03-30 16:52:36
【问题描述】:

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

数据库的名称是“Barnstable, MA:Probate Records 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 }
        });
    }
}

当我调试它时,如果我一开始就悬停“查询”,它会显示为

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 />";
                    }
                }
            }..........

unescape(param[1]) 返回“马萨诸塞州巴恩斯特布尔:遗嘱认证记录 1685-1789”

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

【问题讨论】:

    标签: javascript encoding utf-8 escaping uri


    【解决方案1】:

    注意它给你的东西。

    具体来说,%e2 作为单个字符是"â",而%80%93 不是 ISO-8859-1 字符集中定义的字符。

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

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

    【讨论】:

    • 我什至不知道ISO-8859-1有空缺,我觉得只有一个字符解码很奇怪。
    • 我尝试将其更改为,但收到错误“URI 格式错误”(尝试解码 'Barnstable%2C%20MA%3A%20Probate%20Records%201685%e2%80%931789'跨度>
    【解决方案2】:

    使用decodeURIComponent 而不是unescape

    $('body').append(decodeURIComponent("database=Barnstable%2C%20MA%3A%20Probate%20Records%201685%e2%80%931789")).
    append('<br/>').
    append(decodeURIComponent("Barnstable%2C%20MA%3A%20Probate%20Records%201685%e2%80%931789")).
    append('<br/>').
    append(decodeURIComponent("%e2%80%93"))
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

      【解决方案3】:
      %e2%80%93
      U+2013  –   e2 80 93    EN DASH
      

      Source

      【讨论】:

        猜你喜欢
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 2012-03-24
        • 2015-12-07
        • 2017-10-27
        • 2016-09-11
        相关资源
        最近更新 更多