Javascript Learning Diary

第一课,大小写敏感

从最简单的一句document.getElementById('sIDValue').innerHTML开始。

调试了足足N+遍,都提示错误“对象不支持此属性或方法”。

莫名了,最后才发现document.getELementById('sIDValue').innerHTML
误打成了大写字母“L”。

修改成小写后,问题引刃而解。

所以在引用DOM时,语句必须严格按照大小写写成:

document.getElementById('sIDValue').innerHTML

=====================================
=====================================

第二课,Javascript中escape()函数生成的字符串在PHP环境下的Decode

DOM中,当有字符串(包括中文字串,西文字串,数字串,meta字串以及混和字串)作为参数放置在url中进行传递时,往往会将字符串用escape()函数编码,而PHP脚本在取得这些字符串时,必需对这些字符串进行解码,以便继续利用。由于escape()函数采用的是unicode编码,所以同平时我们所采用的url编码有所不同,例如中文字“看”在escape()编码后会产生以%u开始的一段字符串“%u770B%”。PHP环境下并没有专门的函数来对此类编码进行解码。通过Google和Baidu的检索发现了有很多人都提出过类似的问题,其中以Neo引用日本Phper的一篇解决方案为最佳。经测试后完全可行。

贴上代码以及引用地址:

$decodestr = uniDecode($encodestr,'utf-8')

function uniDecode($str,$charcode) {
//第一个参数是待解码的字符串,第二个参数是输出时的字符编码集

$text = preg_replace_callback("/%u[0-9A-Za-z]{4}/",toUtf8,$str);

return mb_convert_encoding($text, $charcode, 'utf-8');

}

function toUtf8($ar){
foreach($ar as $val){
$val = intval(substr($val,2),16);
if($val < 0x7F){ // 0000-007F
$c .= chr($val);
}elseif($val < 0x800) { // 0080-0800
$c .= chr(0xC0 | ($val / 64));
$c .= chr(0x80 | ($val % 64));
}else{ // 0800-FFFF
$c .= chr(0xE0 | (($val / 64) / 64));
$c .= chr(0x80 | (($val / 64) % 64));
$c .= chr(0x80 | ($val % 64));
}
}
return $c;
}

日本phper的贡献: http://web.archive.org/web/20041031225806/http://vivian.stripper.jp/index.php?itemid=100

Neo的引用
http://www.neo.com.tw/archives/000152.html

国人phper的贡献(未测试):
http://www.hooson.cn/show.php?id=33

补记: 在测试这段代码时,mb_convert_encoding()函数也带来了一些麻烦。首先在Linux+PHP 4.4.2的环境下,提示Call to undefined function: mb_convert_encoding,编辑php.ini文件,启用mbstring.dll的引入,重启Apache后,提示依旧。后在Windows+PHP5.1.1环境下同样处理生效。原因可能是在Linux环境下必须重新编译mbstring模块才能使其生效。其实这个函数的作用只是对已经解码完毕的字符串再进行一次转码,用于显示以及浏览。如果是在utf-8环境下工作的脚本,并不需要再进行这次转换,直接输出$text即可显示,另外采用iconv()函数也可以实现相同的功能。

No comments: