2012年9月15日 星期六

PHP的中文字串長度


先前在計設資料庫程式的時候,為了防止一般使用者能隨意填值到資料庫
(嚴重的話,將引發 XSS 或 SQL Injection 的問題)

所以很"搞剛"(台) 的為每個欄位做了驗證函式。

例如:資料庫中的會員姓名,一般限制使用者最多只能填20個字

「日本人也只有五個字,設限20個字很多了吧!」
「......」
「 什麼?英文名字?放心啦!這網站是在台灣使用的!就強迫他用中文名字好啦」 = =+





所以為了這個欄位驗證而寫了 verify_member_name 函式




function verify_member_name($name){}

這內容必然就是確認$name字數是否超過20個字

一般我們都會在裡面用 strlen 寫:

function verify_member_name($name){
        if ( strlen($name) > 20 ) return "您的名字超過20個字";
        .......

}
原以為呼叫

        $name = "BountyWanted邦堤工作室";
        echo verify_member_name($name);

並不會有任何問題,因為「BountyWanted邦堤工作室」也才 17 個字

( 相信當您看到這行註釋的時候,您也已經把上面那幾個字數過一次了吧,呵 )

不過你會發現,當你這個函式的回傳結果竟然會是「 您的名字超過20個字 」

這就怪了,「 BountyWanted邦堤工作室」也不過僅僅17個字!

問題就出在這,因為我採用的編碼是 UTF-8。

以PHP的角度來看,每個UTF-8的中文字佔 3 個 bytes ( = 3個英文字 )

也就是說這「 BountyWanted邦堤工作室 」

共有12個英文字 加上 5 個中文字 (5 * 3 = 15 bytes = 15個英文字)

總共佔了 12 + 15 = 27 個英文字 ( 爆了 )

所以 strlen($name) 自然就大於20了! 怎辦呢!?

這裡要使用 mb_strlen($name,'utf-8') 來為我們解圍

透過這個函式並指定編碼,即可自動幫我們算出正確的字數!

是的!喇了這麼久的賽,重點只有最後面而已!

較完整的寫法是:


function verify_member_name($name){
        if ( mb_strlen($name,'utf-8') > 20 ) return "您的名字超過20個字";
        .......

}

沒有留言:

張貼留言