我有一堆不同字符集的字符串。该$charset
变量包含当前字符串的字符集。
$content = iconv($charset, 'UTF-8', $content);
完成此操作后,使用strpos
,strlen
等substr
而不是它们的多字节等价物是否安全?我问这个是因为我preg_match
也经常使用。因此,如果我PREG_OFFSET_CAPTURE
用来获取字符串中单词的位置,我不能使用该值mb_substr
来删除单词之前的所有内容。
这完全取决于你想做什么。核心strlen
和类似的功能适用于字节。他们接受和返回的每个数字都是一个字节数或字节偏移量。mb_* 函数对字符进行编码感知。他们接受和返回的所有数字都是字符数或偏移量。
如果您有一种安全的方法来获取字符串中的字节偏移量(“安全”意味着偏移量不在多字节字符的中间),然后,例如,使用 裁剪该偏移量之前的所有内容substr
,那将起作用正好。例如:
$str = '漢字';
$offset = strpos($str, '字');
$cropped = substr($str, $offset);
工作正常。
但是,这不起作用:
$cropped = substr($str, $offset, 1);
您不能安全地切出单个字节而不冒切入多字节字符的风险。
像 strlen() 这样的函数计算字节数,而不是字符数。
有关详细信息,请参阅PHP 手册中的注释:
笔记:
strlen() 返回字节数而不是字符串中的字符数。
如果您使用 UTF-8,请使用mb_*函数,除非您启用了 php.ini 设置mbstring.func_overload以重载标准 strops()、strlen()、substr() 等函数……然后是 strlen () 将计算字符