30

2008.5

在用AJAX与后台交互时经常要对中文进行编码解码,对于JS来说有两个函数:encodeURIComponent用于编码,decodeURIComponent用于解码。而对于后台的PHP来说有两个相对应的编码解码函数:urlencode用于编码,urldecode用于解码。现在看下列两段代码,先给个PHP代码:

<?php
    $myStr1 = '我是中国人';
    $myStr2 = urlencode($myStr1);
    echo $myStr1 . '<br />';
    echo $myStr2 . '<br />';
    echo urldecode($myStr2) . '<br />';
?>

上面这段php代码会输出:
我是中国人
%E6%88%91%E6%98%AF%E4%B8%AD%E5%9B%BD%E4%BA%BA
我是中国人

再来看JS代码:

var myStr1 = '我是中国人';
var myStr2 = encodeURIComponent(myStr1);
document.write(myStr1);
document.write('<br />');
document.write(myStr2);
document.write('<br />');
document.write(decodeURIComponent(myStr2));

上面这段JS代码会输出:
我是中国人
%E6%88%91%E6%98%AF%E4%B8%AD%E5%9B%BD%E4%BA%BA
我是中国人
和上面PHP代码输出的内容是一样的。

29

2008.5

这段时间有点忙,来不及更新博客,今天贴下《程式師應有的態度》,转载自朱邦复先生的《組合語言的藝術》。记得第一次看到这些话的时候,突然感到程式師这种枯燥无趣的职业竟然也有自己的尊严和宗教般的纯洁,使我对程式師态度有了一点自己的感悟。

自動自發,謙虛學習,掌握重點,認真負責,追求完美

寫程式完全是腦力活動,除非是行家,程式師是否真是在工作,別人很難從外表上看出來。同時,如果程式師不是自動自發,對工作無熱忱,甚至心存歧見,則不可能把程式寫好。

自動自發是指發自內心的原動力,且不論是基於名、利、個人成就感或是好奇、賭氣、逞強,只要有了這種動力,問題沒解決,就會形成懸疑,不斷地縈繞腦際,難以休息,直到解決為止。

但是,人的智力相去甚遠,經驗亦各自不同。姑不論個人的才智,在解決問題時,集思廣益,虛懷若谷,必然是最有效、最正確的態度。

問題在於,越是執著、好強,或者自卑自傲的人,其自我觀念越重。遇事即採慣性行事,而且堅持不變,這種人不可能謙虛,更無法學習。

就像藝術家一樣,不參考他人的作品,不學習新的技巧及觀念,固步自封,則難成大師。如果程式師不能謙虛學習,不隨著時代的變化成長,創作出來的程式,其價值可想而知的。

天下英才比比皆是,然而出類拔萃的人卻不多。究其因,在學習、思考時,當是原則重於細節,然而在執行的過程中,卻是細節重於原則。此外,事物變化的組合無窮無盡,主事者必須能針對目標,隨時根據實際狀況,逐步處理。

在各種狀況中,如若程式師不能掌握當前的重點,則凡事皆如有千頭萬緒,難以下手。事實上,從成事敗事的觀點來看,人只有兩種,有能力者,是把複雜的事簡化;無能力者,經常把簡單的事變得複雜無比。而這種能力的差異,就在於能否掌握當前的重點。

觀念清楚了,就看當事人是否能認真負責,堅持貫徹到底。人間世事成敗,完全基於這種態度。不認真,工作時草草了事,不可能有好的成績;不負責更糟,沒有問題也會產生問題,發生問題後,更是無人解決;若參與工作的人多,彼此推卸責任,這樣做人處世必將失敗,程式製作亦然。

所謂認真負責,具體說來,即是在事先要徹底瞭解該做什麼?要做什麼?以及如何去做?工作時要考慮怎樣做最有效率?每一步驟會產生什麼結果?而工作完成後要徹底檢查,目標是否已達成?能否再加以改進?

最後,是對程式的品質及技巧的完美性,應鍥而不捨地追求。一般人常把完美當作不必要的奢侈,其實不然,完美是一種永遠無法達到的理想。重要的觀點是,人只有在追求完美的過程中,才能不斷地進步、昇華。一個人若沒有理想,就與動物無異,一個程式師若沒有理想,套句愛因斯坦的名言,不過是隻「訓練有素」的小狗罷了。

態度來自習慣,習慣則來自於學習及鍛鍊,有志向上者,應該自我要求,努力學習。等到鍛鍊久了,習慣成自然,有了良好的態度,終有成為大師的一天。

28

2008.5

今天在学《AJAX and PHP》的过程中,用XMLHttpRequest就是获得不到responseXML值,但可以获得responseText值。在地址栏中直接打开目标响应的PHP文件,文件代码如下:

<?php
    @header('Content-Type: text/xml');
    echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
    echo '<response>';
    $name = $_GET['name'];
    $userNames = array('CRISTIAN','BOGDAN','FILIP','MIHAI','YODA','你好');
    if(in_array(strtoupper($name),$userNames))
    echo 'Hello,master ' . urldecode($name) . '!';
    else if(trim($name)=='')
    echo 'Stranger,please tell me your name!';
    else
    echo urldecode($name) . ',T don\'t know you!';
    echo '</response>';
?>

发现浏览器用HTML的形式显示文件的,但应该是用XML的形式显示此文件的。忽然记得以前好像也发生过类似的错误,解决方法是把PHP文件保存成无BOM的UTF8格式的,修改后果然都正常了!

上网查了一下,如果把PHP保存成带有BOM的UTF8文件,会因为编码方式对于BOM不是强制的而出现不同的处理方式,所以最好把文件保存成无BOM的UTF8格式的。而目前windows系统中对于保存文件的处理方式默认情况下都会加上BOM,可以使用些高级编辑器修改文件,如UltraEdit、SciTE等。

, , ,

26

2008.5

以前没有做过广告邮件,以为只要会做DIV+CSS,邮件也就完全可以搞定了。通过这几天的邮件制做心得和同事的经验,才发现邮件制做也是有很多要点的,现列出如下:

  1. CSS代码最好不要放在头部“head”标签内,因为有些邮箱系统会认为这是不友好的代码,会把它屏蔽掉;
  2. 做邮件最好直接用图片,因为邮箱系统有时会屏蔽CSS代码,这样文字会现地不好看,可以把文字放在图片的“alt”属性内。
  3. 不要让两个“table”元素直接相邻在一起,因为当转发你的邮件时,会自动在两个“table”元素之间加一个回车换行符,会破坏页面的布局结构。

暂时只有这些了,以后如果时间再慢慢加上。

23

2008.5

现在的浏览器有很多种,每种又有不同的版本,为了让网页在不同的浏览器的呈现出相同的样式,页面制做人员便使用大量的偏方(即hack,我把它叫做偏方)。做这种事情是很痛苦的,做过的人都知道。于是有些人分别针对不同的浏览器编写相对应的CSS文件,然后用IE条件注释方式来判断载入,代码如下:

<link href="common.css" type="text/css" media="screen, projection" />
<!--[if IE 7]><link href="ie7.css" type="text/css" media="screen, projection" />
< ![endif]--><!--[if IE 6]><link href="ie6.css" type="text/css" media="screen, projection" />
< ![endif]-->

其实也可以用后台动态语言来判断浏览器种类的。在PHP中可以使用函数“$_SERVER['HTTP_USER_AGENT']”,它和JS中的“navigator.userAgent”函数具有相似的功能,而且我在PHP官网上找到一篇介绍介绍get_browser函数的文章,在里面找到了不少判断浏览器种类的代码,现转一个在这里:

<?php
//        _______
// ----- | CONF. |
// add new browsers in lower case here, separated
// by spaces -  order is important: from left to
// right browser family becomes more precise
$browsers = "mozilla msie gecko firefox ";
$browsers.= "konqueror safari netscape navigator ";
$browsers.= "opera mosaic lynx amaya omniweb";
//        _______
// ----- |PROCESS|
$browsers = split(" ", $browsers);
$nua = strToLower( $_SERVER['HTTP_USER_AGENT']);
$l = strlen($nua);
for ($i=0; $i<count($browsers); $i++){
  $browser = $browsers[$i];
  $n = stristr($nua, $browser);
  if(strlen($n)>0){
    $GLOBALS["ver"] = "";
    $GLOBALS["nav"] = $browser;
    $j=strpos($nua, $GLOBALS["nav"])+$n+strlen($GLOBALS["nav"])+1;
    for (; $j<=$l; $j++){
      $s = substr ($nua, $j, 1);
      if(is_numeric($GLOBALS["ver"].$s) )
      $GLOBALS["ver"] .= $s;
      else
      break;
    }
  }
}
//        _______
// ----- |  USE  |
echo("<pre>Your browser is: ");
echo($GLOBALS["nav"] . " " . $GLOBALS["ver"] . "</pre>");
?>

如果你用的是IE6,页面会显示:Your browser is: msie 6.0;如果用的是火狐2,会显示:Your browser is: firefox 2.0。

分页: 1/3 第一页 1 2 3 下页 最后页 [ 显示模式: 摘要 | 列表 ]