`
阅读更多
Ajax 实现论坛的用户名检测。

先简化了下 Ajax.js, 让它能在不同的程序里指定不同的 url, param 和 div 的 id.
var req, Div;
var debug = 0;

function Ajax(DivName, url, parameters) {
    if (window.XMLHttpRequest) req = new XMLHttpRequest();
    else if (window.ActiveXObject) req = new ActiveXObject("Microsoft.XMLHTTP");
    else return; // fall on our sword
    req.onreadystatechange = processReqChange;
    req.open("POST", url, true);
    req.setRequestHeader('Connection', 'close');
    req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    req.send(parameters);
    Div = document.getElementById(DivName);
}

function processReqChange() {
    // only if req shows "complete"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
            // show content in div
            Div.innerHTML = req.responseText;
        } else {
            if (debug) alert('status is not 200,but ' + req.status);
        }
    }
}

调用的代码为:
<input type="text" maxlength="12" name="username" onblur="CheckName(this.value)"> * 2 - 12 字符(1 - 6 汉字)
<script language="javascript" type="text/javascript" src="./js/Ajax.js"></script>
<script language="javascript" type="text/javascript">
    function CheckName(aObj) {
        try { Ajax('CheckName', 'CheckName.pl', 'mode=Ajax&name=' + encodeURIComponent(aObj)); }
        catch (e) { return; }
    }
</script>
<div id="CheckName"></div>

Update: 感谢 easunlee 的提醒, encodeURIComponent 对 IE5.5 以下无效,所以我们用了 try+catch 在无效情况下不调用该函数(和|或者)弹出 alert 提示升级浏览器。
问题出现了
首先解释下 encodeURIComponent 的作用:将文本字符串编码为一个有效的统一资源标识符 (URI)。
为什么要用这个是因为我想把 username 整个当做参数传递给 CGI, 而不让 CGI 将 username 分割掉。这话听不明白的话我换种方式来说,如果 username = 'a&foo=boo' 而不用 encodeURIComponent 的话,整个参数就成了 name=a&foo=boo, 这样 CGI 就获得两个参数 name 和 foo. 这不是我们想要的。
Javascript 里还有个同样功能的函数 encodeURI, 但是此方法不会对下列字符进行编码:":"、"/"、";" 和 "?"。
刚开始我都输入英文检测代码是否运行正常,后来因为我不想用户名为“客人”,所以就试了下。
结果很令我奇怪,div 为 CheckName 里的输出是“瀹汉”。
一看到这个,第一反应就是编码问题。

客人经过 JS 的 encodeURIComponent 转化后得到的值为 %E5%AE%A2%E4%BA%BA, 而我直接在浏览器里输出客人后转的值为 %BF%CD%C8%CB. 辨别后,猜测 Javascript encodeURIComponent 将“客人”转为了 utf-8 编码。

于是在 CheckName.pl 里加了编码转换。

use Encode qw/from_to/;
my $name = $q->param('name');
from_to($name, "utf8", "gb2312");

终于搞定。
分享到:
评论

相关推荐

    encodeURIComponent编码后java后台的解码

    同学的毕业设计出现JavaScript用encodeURIComponentt编码后无法再后台解码的问题。 原来他是这样写的: window.self.location="searchbytext.action?searchtext="+encodeURIComponent(seartext);

    Javascript中escape(),_encodeURI()和encodeURIComponent()之精析与比较.doc

    在JavaScript中,`escape()`, `encodeURI()`, 和 `encodeURIComponent()` 是三个常见的字符串编码函数,它们各自有独特的用途和特点。理解它们的区别对于编写健壮的JavaScript代码至关重要。 首先,`escape()` 函数...

    encodeURIComponent 文档

    ### encodeURIComponent与encodeURI详解 在Web开发中,处理URL参数是一项常见的任务,特别是当涉及到包含非ASCII字符(如中文)的参数时。本文将详细解释`encodeURIComponent`与`encodeURI`的区别及其应用场景,并...

    encodeURIComponent encodeURI 中文转GBK编码

    serialize , encodeURIComponent encodeURI 中文转成GBK编码 encodeURIComponent encodeURI 默认转 utf-8 ;重写方法 转成GBK

    JS中三种编码方式(escape,encodeURI,encodeURIComponent)

    有三种主要的编码方法:`escape()`, `encodeURI()`, 和 `encodeURIComponent()`。它们各自有不同的应用场景和特点,下面将详细介绍这三个函数的工作原理、区别以及使用场景。 1. `escape()` `escape()` 函数主要...

    escape、encodeURI、encodeURIComponent 区别详解

    ### escape、encodeURI、encodeURIComponent 区别详解 在前端开发中,经常需要用到字符串编码与解码的方法来确保数据在网络传输中的正确性与安全性。本文将详细介绍 `escape()`、`encodeURI()` 和 `...

    深入解析:JavaScript中的`encodeURIComponent`与`decodeURIComponent`方法

    为了解决这些问题,JavaScript提供了两个内置函数:encodeURIComponent和decodeURIComponent。这两个函数对于编码和解码URL组件至关重要。本文将详细探讨这两个函数的工作原理、使用场景以及如何在实际开发中正确...

    url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介

    ### URL的三个JS编码函数:`escape()`, `encodeURI()`, `encodeURIComponent()` 简介 在Web开发中,经常遇到的一个问题是URL传递中文字符时出现乱码的情况。为了解决这一问题,JavaScript提供了几种不同的编码方法...

    在asp中使用js的encodeURIComponent方法

    在ASP(Active Server Pages)中使用JavaScript的encodeURIComponent方法涉及到服务器端的ASP和客户端的JavaScript两种技术的结合使用。这是一种常见的跨语言交互方法,可以在服务器端代码中插入客户端JavaScript代码...

    java 中类似js encodeURIComponent 函数的实现案例

    在Java编程语言中,没有内置的方法直接等同于JavaScript中的`encodeURIComponent`函数,该函数用于编码URI(统一资源标识符)组件,确保特殊字符被适当地转换为百分比编码。然而,通过组合Java的`URLEncoder`和`...

    JS中encodeURIComponent函数用php解码的代码

    `encodeURIComponent`是JavaScript中用于对URI组件进行编码的一个函数,它可以确保特殊字符和非ASCII字符在URL中正确表示。当这些编码后的字符串需要在PHP中解码时,通常会用到`urldecode`和`iconv`这两个函数。 `...

    escape、encodeURI 和 encodeURIComponent 的区别

    在JavaScript中,`escape()`, `encodeURI()`, 和 `encodeURIComponent()` 是三个常见的字符串编码函数,它们用于处理和转换字符串中的特殊字符。虽然它们都与字符串编码有关,但各自的作用和适用场景有所不同。 ...

    简单明了区分escape、encodeURI和encodeURIComponent

    在JavaScript中,`escape`、`encodeURI`和`encodeURIComponent`是三个用于字符串编码的方法,它们各有不同的用途和特点。理解这些方法的区别对于处理URL、查询字符串和其他特殊字符的编码至关重要。 首先,`escape`...

    谈谈encodeURI和encodeURIComponent以及escape的区别与应用

    在JavaScript中,`encodeURI()`、`encodeURIComponent()`和`escape()`是三个用于字符串编码的函数,它们的主要目的是确保特殊字符在传输过程中不会引起错误。理解它们之间的差异对于编写正确处理URL和数据的...

    js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解

    JavaScript中的字符串编码函数主要包括`escape()`、`encodeURI()`和`encodeURIComponent()`,它们的作用是对字符串进行编码处理,以便在网络中安全地传输数据。这三种函数都有对应的解码函数:`unescape()`、`...

Global site tag (gtag.js) - Google Analytics