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個字";
.......
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言