分享技术 · 探索极限 · Code is Art
后端开发 发布 2016-06-21 1.5k 阅读 约 2 分钟阅读

PHP 中 strlen 与 mb_strlen 的区别

通过中英文混排字符串示例解释 strlen 与 mb_strlen 的区别,说明字节长度、字符长度和不同编码下的统计差异。

在 PHP 中,strlenmb_strlen 都是求字符串长度的函数,但它们统计的维度不同。strlen 统计字节数,mb_strlen 可以按指定编码统计字符数。

先看例子:

<?php

$str = '中文a字1符';

echo strlen($str) . '<br>';              // 14
echo mb_strlen($str, 'utf8') . '<br>';  // 6
echo mb_strlen($str, 'gbk') . '<br>';   // 8
echo mb_strlen($str, 'gb2312') . '<br>';// 10

分析:在 strlen 计算时,一个 UTF-8 中文字符占 3 个字节,所以“中文a字1符”的长度是 3 * 4 + 2 = 14。在 mb_strlen 计算时,如果选定编码为 UTF-8,则会将一个中文字符当作长度 1 来计算,所以“中文a字1符”的长度是 6。

利用这两个函数可以联合计算出一个中英文混排字符串的占位宽度:中文字符占位 2,英文字符占位 1。

<?php

echo (strlen($str) + mb_strlen($str, 'UTF-8')) / 2;

例如“中文a字1符”的 strlen($str) 值是 14,mb_strlen($str) 值是 6,则可以计算出占位是 10。

PHP 内置的字符串长度函数 strlen 无法正确处理中文字符串,它得到的是字符串所占的字节数。对于 GB2312 编码的中文,strlen 得到的值是汉字个数的 2 倍;对于 UTF-8 编码的中文,则通常是 3 倍。

发表回复