Archive

‘專業技術’ 分類過的Archive

PHP UTF-8 文件因BOM而發生問題的相關解法

2010年5月4日 3 則評論

最近在PHP4,PHP5上發現有些程式不相容的問題,在PHP4程式可以運行的程式,到了PHP5環境反而出現了

Cannot modify header information – headers already send by…..的錯誤訊息

以前遇到這種問題,就是在使用Header之前已經有output到瀏覽器,在找問題時,一般是include file或在<?PHP ?>前後有空白字元

但PHP4可以執行正常,怎麼到了PHP5會出問題呢?

去追查了一下,發現這似乎是UTF8檔案格式的問題,現行UTF-8格式的檔案,在檔頭會有一個BOM(Binary Order Mark)的字元,印象中在以前的經驗上,往往在處理UTF-8格式的XML,有時也會被這個BOM弄煩了

看來這次也是一樣,因為目前PHP似乎在針對UTF-8的php程式碼,沒有把這BOM碼處理的很好,導致如果有使用Header() 或是include file 時就會發生一些問題

小弟在此整理出一些解法:

1.如果你可以動到php的參數設定檔,那就簡單多了,請在php.ini之中調整output_buffering參數,這參數預設是沒有啟用的,要將此參數打開,就是把 分號(;)拿掉即可,如下:

output_buffering = 4096

這個參數是開了個buffer給output時用的,看php.ini上的註解提到這個是要讓程式允許可以在傳送header及cookies時可暫存的buffer,當使用時就不會直接傳到Client啦;不過這會有一些些影響整個PHP的執行效能,但影響不大啦,這算是最快可以排除的方式,所以列在第一點給大家參考!!

2.如果你有使用UltraEdit(至少是版本14以上才有這功能),可以於存檔時選擇檔案格式UTF-8並且無BOM版本的檔案,這樣就可以避掉BOM會帶來的問題了 (沒有BOM也不會造成UTF-8檔案格式的判斷錯誤)

或是可以下載NotePad++,這套 free的文字編輯器,可到此連結下載http://notepad-plus.sourceforge.net/tw/site.htm 台灣人寫的哦~要愛用國貨外!!
在開啟檔案時,上方選單編碼選項中的「轉換至UTF-8碼(檔首無BOM碼)即可(原文章相關錯誤已修正,感謝那位叫白目捷的友人提供指證),如下圖:

NotePad++ 轉換至UTF-8 無BOM

不過目前要一個一個檔案去做,小弟找了一下,似乎沒有找到可以批次去除BOM的,所以暫時加減用囉~!! 如果有大大知道有程式可以做到,請再告知小弟! 感恩喔!!

補充:後來小弟有找到一套叫Uni2ME,他可以進行批次轉換,下載網址http://www.softking.com.tw/soft/clickcount.asp?fid3=22623
要注意的是,他預設的參數設定是有含BOM碼,要手動調整才行
有需要的人請自行下載使用  

上述就是小弟整理的解法,不過要注意在不同的PHP版本上執行時,還要注意例如session_start()這個函式一定要在最前面執行,不然也有可能會於PHP5上顯示錯誤訊息

參考資料:
http://bbs.ecstart.com/thread-30347-1-4.html

Categories: PHP Tags: ,

Tomcat網頁GZIP壓縮設定

2010年4月16日 尚無評論

相信絕大部份的程式設計師,內心都會有一個小小的願望,就是自己寫的系統可以給很多人使用,當系統愈有名氣時,自己就愈高興,不過或許這也是另一個考驗的開始…..

當多人使用系統時,除了程式要寫的好之外,系統的硬體等級、應用系統伺服器的調校、資料庫參數的調校等當然還有頻寬的限制等,都是會影響你系統運行時的品質,上述要點,一個出了問題,就算你其它的設定再好,也沒啥鳥用,但當都一一調整後,你的系統還是出現負擔過重時,在有限的資源無法擴充之下,就只能吹毛求疵從各項再去下手。本次要和大家介紹的網站設定GZIP壓縮設定,就是一般常會忘了可以這樣設定,並且這樣的設定可以大幅改善頻寬的使用,經小弟的測試,一般一個圖文並貌的網站,總共約可以減少至少一半以上的大小,這樣你頻寬瞬間可以大幅度支援更多使用者,就讓我快點告訴大家這個好用的設定吧。

先說明一下什麼是網頁GZIP壓縮設定,因為目前網頁都是以原始碼的模式進行傳遞,再藉由瀏覽器去直譯產出你看到的網頁,所以當你看到網頁原始碼時,都是一些如何呈現的語法,如果我們先將網頁原始碼壓縮後再傳輸,到了瀏覽者的電腦上再解開,這樣就可以簡省很多傳輸的頻寬。而網頁原始碼這種純文字格式的檔案,壓縮起來非常有成就感,因為裡面太多空白及相同的字眼,所以一般壓起來,都可以壓縮到只剩下十之一以下的容量,這樣就能快速傳送網頁資訊。

目前有支援GZIP的瀏覽器非常眾多,包含IE、Firefox、chrome等目前市佔率極高的瀏覽器都有支援,所以等於九成以上的瀏覽者都可以適用,這次我們就來說說JAVA WEB APPLICATION Tomcat如何設定 GZIP壓縮傳輸設定,首先我們開啟Tomcat/conf/server.xml,找尋以下設定

<Connector port=”8080″ maxHttpHeaderSize=”8192″
  maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
  enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
  connectionTimeout=”20000″
  disableUploadTimeout=”true” />

這主要是設定Tomcat系統在運行時的一些參數,包含監聽的Port、同時最大接受的request等,其實還有很多參數可以設定,當然包含了GZIP的壓縮設定,所以我們可以在此加上以下參數

  compression=”on”  
是否啟用壓縮機制

  compressionMinSize=”2048″ 
設定壓縮檔案最小的size,單位是Bytes,所以預設值為2K,這裡的意思是當檔案超過2K時才會進行壓縮

  noCompressionUserAgents=”gozilla, traviata”
設定不支援的瀏覽器就不使用壓縮

  compressableMimeType=”text/html,text/xml”
設定要壓縮的contextType為何,除了html及xml之外,還可以多設定一些也是原始碼的檔案例如text/css,text/javascript等,讓css及javascript的檔案也能壓縮傳輸,至於一些圖檔及已經壓縮過的檔案建議不要設進來,因為圖檔一般都已經有壓縮過了,如果將一些壓縮過的檔案再壓,除了浪費時間外,搞不好檔案還會愈壓愈大喔

所以我們就趕快設定看看是否有改善,加入上述壓縮的設定後,參數如下:

<Connector port=”8080″ maxHttpHeaderSize=”8192″
  maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
  enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
  disableUploadTimeout=”true”
  connectionTimeout=”20000″
  compression=”on”
  compressionMinSize=”2048″
  noCompressionUserAgents=”gozilla, traviata”
  compressableMimeType=”text/html,text/xml”/>

除了Tomcat可以這樣設定外,如果你有使用Apach也可以很容易設定GZIP壓縮設定,如果有興趣,請去找孤狗大師問問題吧!!

Categories: JAVA Tags: ,

於網頁顯示特殊符號(Registered,copyright,trademark)

2010年3月24日 尚無評論

很少會用到一些特殊符號,剛好有需要去查了一下,所以整理出來,好讓下次又要用到時,可以快點查到,此外,也順便查了一下意思,有興趣的人請再延伸閱讀

©  &#169; Copyright

® &reg;  Registered
®符號是Registered(即“註冊“)的簡稱,其代表已獲得註冊之意,其通常被標示於品牌的右上或右下方,藉此告知相關消費者與競爭同業,該
品牌已是註冊商標,如果他人使用相同或近似商標於相同或類似商品/服務上,商標專用權人將可對其提起商標侵權訴訟。

&trade; or  &#8482; TM (Trademark)
而TM則是Trademark(即“商標”)的簡稱,代表商標的意思,其通常亦被標示於品牌的右上或右下方,藉此告知相關消費者與競爭同業,該品牌
已被做為商標使用,而非一般商品名稱或描述性用語。雖然無論商標是否註冊皆可標示TM,但一般來說該符號大多標示在尚未獲得註冊之商標上。

參考資料:
商標標示®和TM有何不同?
HTML Special Characters

Categories: WebDesign Tags: , ,

fgetcsv 中文字亂碼排除 for PHP

2010年3月10日 尚無評論

PHP相關的函式真的是很多,而且都蠻簡單操作的
單單要讀CSV檔,只要透過fgetcsv 函式就可以處理,而且還可以把擾人的雙引號問題一併排除,不過在使用時,發現中文的處理上有一些瑕疵

上網找了一些資料,針對此問題有蠻多解法,不過還是要看一下問題發生原因

1.如果你的資料檔是big5,就要在讀入時進行iconv or mb_convert_encoding 轉成UFT-8才能使用

2.如果你都是utf-8還遇到問題,就是fgetcsv 的問題啦(我就是這個啦)

所以找到一篇有人重寫了fgetcsv ,試用後發現問題排除了,所以也分享一下解法

function __fgetcsv(&$handle, $length = null, $d = “,”, $e = '”') {
    $d = preg_quote($d);
    $e = preg_quote($e);
    $_line = “”;
    $eof=false;
    while ($eof != true) {
        $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
        $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        if ($itemcnt % 2 == 0)
            $eof = true;
    }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));

    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
    preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
    $_csv_data = $_csv_matches[1];

    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
        $_csv_data[$_csv_i] = preg_replace(“/^” . $e . “(.*)” . $e . “$/s”, “$1”, $_csv_data[$_csv_i]);
        $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
    }
    return empty ($_line) ? false : $_csv_data;
}

經過使用上面的函式,中文字解析出來,字首不會再是亂碼了,但有點要特別注意的,如果你後方有帶很多空值的欄位,他會一併清除,這和原本的fgetcsv 不太一樣,在轉換時要特別注意。

資料來源:
http://blog.csdn.net/shilian_h/archive/2009/07/22/4371051.aspx

Categories: PHP Tags: , ,

貨幣金額數值轉換加上逗號「,」 for PHP

2010年3月5日 尚無評論

在PHP要顯示貨幣金額,就是有加上逗號「,」的數字是很容易的
原本以為是要使用printf 函式,結果去查了一下,有個number_format 函式就可以達到
以下為他的語法

string number_format(float number, int [decimals], string [dec_point], string [thousands_sep]);

如想看更詳細的說明,請至 http://php.net/manual/en/function.number-format.php

所以我們可以用以下指令

$return=number_format(“1000000.1234″,4,”.”,”,”);

就可以得到1,000,000.1234,看起來還蠻容易的,結果再進一步的測試,發現怪怪的
當我的值為 10000000000000.4232326 應該可以得到

10,000,000,000,000.4232

沒想到結果不對了,竟然得到如下的資料,小數的數值不對了

10,000,000,000,000.4238

多測了幾組,都發現這狀況,看來在數值大於一定位數時,就會有錯亂,應該是PHP數值的變數接受的位數有限,所以大於的數值就可能會補數來補數去的吧..反正就是亂了

所以為了這種位數超大的值,小弟寫了一個小函式,改用字串的方式處理,就可以排除此問題

function money_format($data,$n=0) {
$data1=number_format(substr($data,0,strrpos($data,”.”)==0?strlen($data):strrpos($data,”.”)));
$data2=substr( strrchr( $data, “.” ), 1 );
if($data2==0) $data3=””;
  else {
   if(strlen($data2)>$n) $data3=substr($data2,0,$n);
     else $data3=$data2;
  $data3=”.”.$data3;
  }
return $data1;
}

傳入值為$data 就是你要轉換的數值,$n就是小數點後面的位數

除了排除這個問題,在使用number_format時發現如果設定小數位數四位,如不足四數就會補零 。例如: 100000.12 會顯示  100,000.1200 ,所以小弟也順便調整,可以把後面的零給取消掉。在此提供給一樣遇到這問題的人一個方法(不一定是好方法,但一定是可行的方法)

Categories: PHP Tags: ,
分頁: 上一頁 1 2 3 ... 7 8 9 10 11 12 13 ... 26 27 28 下一頁