# PHP字符串长度:strlen() 与 mb_strlen() 的区别
在PHP开发中,计算字符串长度是一个常见需求,但很多开发者在使用strlen()和mb_strlen()时容易混淆。本文将详细解析这两个函数的区别及使用场景。
## 基础概念
### strlen()
```php
int strlen ( string $string )
```
- 计算字符串的字节长度
- 对于ASCII字符(每个字符1字节),返回字符数
- 对于多字节字符(如中文),返回字节数而非字符数
### mb_strlen()
```php
mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
```
- 计算字符串的字符长度
- 考虑字符编码,正确计算多字节字符
- 需要启用mbstring扩展
## 核心区别
| 特性 | strlen() | mb_strlen() |
|------------|------------------|-------------------|
| 计算单位 | 字节数 | 字符数 |
| 多字节支持 | 不支持 | 支持 |
| 扩展依赖 | PHP核心函数 | 需mbstring扩展 |
| 性能 | 更快 | 稍慢 |
## 实际示例
```php
$str = "Hello世界";
// strlen()示例
echo strlen($str); // 输出:11 (5英文+每个中文3字节×2)
// mb_strlen()示例
echo mb_strlen($str, 'UTF-8'); // 输出:7 (5英文+2中文)
```
## 常见问题
### 为什么中文字符长度不对?
当使用strlen()计算中文字符串时,常见"长度不对"的问题。这是因为:
- UTF-8编码下,每个中文字符占3字节
- GBK编码下,每个中文字符占2字节
- strlen()计算的是总字节数而非字符数
### 如何选择使用哪个函数?
1. 处理纯英文内容:strlen()更高效
2. 处理多语言混合内容:必须使用mb_strlen()
3. 不确定内容类型:优先使用mb_strlen()
## 性能考虑
虽然mb_strlen()更准确,但在纯ASCII字符场景下,strlen()性能更好。在大规模循环中处理已知的纯英文内容时,可优先使用strlen()。
## 最佳实践
1. 始终明确字符编码:
```php
mb_strlen($str, 'UTF-8');
```
2. 统一项目中的字符串处理函数
3. 在需要精确字符位置操作时(如截取),务必使用mb_系列函数
## 扩展知识
mbstring扩展还提供了其他有用的多字节安全函数:
- mb_substr() - 安全截取字符串
- mb_strpos() - 安全查找字符位置
- mb_strtolower() - 安全转换大小写
希望本文能帮助您理解PHP中字符串长度计算的区别,在实际开发中选择合适的函数。