【问题标题】:Why use iconv_strpos instead of strpos?为什么使用 iconv_strpos 而不是 strpos?
【发布时间】:2011-03-31 12:47:02
【问题描述】:

与 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?

【问题讨论】:

  • 您是否曾尝试处理诸如“АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ”之类的文本?如果您使用 strpos() 从数据库 (UTF8) 中获得类似的信息,将无法解决获取特定字符位置的问题。如果您尝试获取非 ANSI 字符串中的位置,请不要使用 strpos()。

标签: php iconv strpos


【解决方案1】:

它通常仅在使用多字节编码(如 UTF-8 或 UTF-16)时才相关。

一个字符可能由多个字节组成(UTF-8 中的非 7 位 ASCII 字符就是这种情况——这些字符的编码长度是可变的。UTF-16 有 2 个字节的字符)。

【讨论】:

    【解决方案2】:

    当您使用多字节编码时,单个字符可以由可变数量的字节表示(例如,在 UTF-8 中,从 1 到 4)。这与单字节编码不同,单字节编码总是代表一个字符。

    考虑一个用 UTF-8 编码的双字符字符串,其中第一个字符需要 3 个字节来表示,而第二个字符只占 1(所有序数 'a' 为例)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2021-10-12
      • 2011-10-14
      相关资源
      最近更新 更多