使用UTF-8字符串的strpos是否安全?

时间:2013-07-31 17:22:10

标签: php string utf-8

我有一堆带有不同字符集的字符串。 $charset变量包含当前字符串的字符集。

$content = iconv($charset, 'UTF-8', $content);

完成此操作后,使用strposstrlensubstr等等而不是多字节等效文件是否安全?我问这个因为我也经常使用preg_match。因此,如果我使用PREG_OFFSET_CAPTURE来获取字符串中单词的位置,则无法使用mb_substr的值来删除单词之前的所有内容。

2 个答案:

答案 0 :(得分:2)

这完全取决于你想做什么。核心strlen和类似函数适用于字节。它们接受并返回的每个数字都是字节计数或字节偏移量。 mb_ *函数在字符上运行编码感知。他们接受并返回的所有数字都是字符数或偏移量。

如果你有一种在字符串中获得字节偏移的安全方法(“安全”意味着偏移不在多字节字符的中间),然后,例如,使用{{在该偏移之前裁剪所有内容1}},那就行得很好。例如:

substr

工作正常。

然而,这不起作用:

$str     = '漢字';
$offset  = strpos($str, '字');
$cropped = substr($str, $offset);

您不能安全地删除单个字节,而不会有切入多字节字符的风险。

答案 1 :(得分:0)

strlen()等函数计算字节数,而不是字符数。

有关详细信息,请参阅PHP Manual中的注释:

  

注意:

     

strlen()返回字节数而不是字符串中的字符数。

如果您正在使用UTF-8,请使用mb_*函数,除非您启用了php.ini设置mbstring.func_overload以重载标准strops(),strlen(),substr ()等函数...然后strlen()将计算字符