[英]Safe to use strpos with UTF-8 strings?
我有一堆不同字符串的字符串。 $charset
变量包含当前字符串的字符集。
$content = iconv($charset, 'UTF-8', $content);
完成此操作后,使用strpos
, strlen
, substr
等是否安全,而不是多字节等效? 我问这个因为我也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.