字串大小寫轉換是 PHP 中高頻操作,`strtolower()` 與 `strtoupper()` 底層均委託給同一核心函式處理。本文基於 PHP 5.4 源碼(同樣適用於 PHP 7/8 核心邏輯),解析其實現細節與效能特徵。
string strtolower ( string $string ) string strtoupper ( string $string )
// 簡化後的 php_strtolower 核心邏輯
PHPAPI char *php_strtolower(char *s, size_t len)
{
unsigned char *c = (unsigned char *)s;
unsigned char *e = c + len;
while (c < e) {
*c = tolower(*c); // 標準 C 庫 tolower()
c++;
}
return s;
}
// php_strtoupper 同理,使用 toupper()
| 場景 | 推薦函式 | 說明 |
|---|---|---|
| 純 ASCII 英文 | `strtolower()` / `strtoupper()` | 最快,無多位元組開銷 |
| 包含中文、全形、Unicode | `mb_strtolower()` / `mb_strtoupper()` | 需安裝 `mbstring` 擴展,指定編碼 `UTF-8` |
| 區域相關(如土耳其語 İ/i) | `mb_strtolower($str, 'UTF-8')` | 配合 `setlocale` + `mbstring` 或 `IntlChar::tolower()` (PHP 7+) |
| 大量字串批次轉換 | 預先轉換鍵名 / 使用陣列映射 | 避免重複呼叫函式 |
錯誤: `strtolower('中文')` 期望轉換全形字母。
事實: 返回原字串,因為中文字節不在 ASCII 範圍內。
正確: `mb_strtolower('中文', 'UTF-8')` 或 `mb_convert_case($str, MB_CASE_LOWER, 'UTF-8')`。