0

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

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

完成此操作后,使用strpos,strlensubstr而不是它们的多字节等价物是否安全?我问这个是因为我preg_match也经常使用。因此,如果我PREG_OFFSET_CAPTURE用来获取字符串中单词的位置,我不能使用该值mb_substr来删除单词之前的所有内容。

4

2 回答 2

2

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

如果您有一种安全的方法来获取字符串中的字节偏移量(“安全”意味着偏移量不在多字节字符的中间),然后,例如,使用 裁剪该偏移量之前的所有内容substr,那将起作用正好。例如:

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

工作正常。

但是,这不起作用:

$cropped = substr($str, $offset, 1);

您不能安全地切出单个字节而不冒切入多字节字符的风险。

于 2013-07-31T17:50:22.587 回答
0

像 strlen() 这样的函数计算字节数,而不是字符数。

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

笔记:

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

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

于 2013-07-31T17:33:54.080 回答