为什么使用iconv_strpos而不是strpos?

时间:2011-03-31 12:47:02

标签: php iconv strpos

  

与strpos()相比,iconv_strpos()的返回值是针前面出现的字符数,而不是找到针的位置的偏移量(以字节为单位)。   (来源:http://www.php.net/manual/en/function.iconv-strpos.php

以下代码示例显示iconv_strpos()strpos()返回相同的值。

$string = "dd.MM.yy";

echo "d: ".strpos($string, 'd'); // 0
echo "M: ".strpos($string, 'M'); // 3
echo "y: ".strpos($string, 'y'); // 6

echo "d: ".iconv_strpos($string, 'd'); // 0
echo "M: ".iconv_strpos($string, 'M'); // 3
echo "y: ".iconv_strpos($string, 'y'); // 6

为什么我应该使用iconv_strpos而不是strpos?

2 个答案:

答案 0 :(得分:5)

通常仅在使用UTF-8或UTF-16等多字节编码时才有意义。

字符可能由多个字节组成(UTF-8中的非7位ASCII字符也是如此 - 这些字符在编码长度上是可变的.UTF-16具有2字节字符)。

答案 1 :(得分:5)

当您使用多字节编码时,单个字符可以用可变数量的字节表示(例如,以1到4的UTF-8表示)。这与单字节编码形成对比,其中每个字节总是代表一个字符。

考虑以UTF-8编码的双字符串字符串,其中第一个字符需要3个字节来表示,而第二个字符仅占用1个(所有带有序号< 128的字符都具有UTF-8中的这个属性,所以让我们看看使用'a'作为示例。)

在这种情况下iconv_strpos($string, 'a')将返回1(第二个字符为'a'),而strpos($string, 'a')将返回3(指第四个字符,因为它不能告诉前三个字节实际上只是一个字符;它假定编码是单字节的。)