繁体   English   中英

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

[英]Safe to use strpos with UTF-8 strings?

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

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

完成此操作后,使用strposstrlensubstr等是否安全,而不是多字节等效? 我问这个因为我也preg_match使用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 ()将计算字符数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM