2011-03-31 168 views
2

與strpos()相反,iconv_strpos()的返回值是出現在指針前面的字符數,而不是以字節爲單位的指針找到位置的偏移量。 (來源:http://www.php.net/manual/en/function.iconv-strpos.php爲什麼使用iconv_strpos而不是strpos?

下面的代碼示例顯示了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?

+0

你有沒有試過處理「АБВГДЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ」這樣的文字?如果你使用strpos()從數據庫(UTF8)得到這樣的東西,將不會解決獲取特定字符位置的問題。如果試圖獲取非ANSI字符串的位置,請不要使用strpos()。 – Wh1T3h4Ck5 2011-03-31 13:07:51

回答

5

它通常僅在使用多字節編碼(如UTF-8或UTF-16)時纔有意義。

一個字符可能由多個字節組成(對於UTF-8中的非7位ASCII字符,這種情況在編碼長度上是可變的,UTF-16有2字節字符)。

5

當您使用多字節編碼時,單個字符可以用可變數量的字節表示(例如在UTF-8中從1到4)。這與單字節編碼相反,其中每個字節總是隻表示一個字符。

考慮一個用UTF-8編碼的雙字符串,其中第一個字符需要3個字節來表示,而第二個字符只佔用1個(所有字符都有這個屬性在UTF-8中,所以讓我們例如使用'a')。

在這種情況下iconv_strpos($string, 'a')將返回1(第二個字符是'a'),而strpos($string, 'a')將返回3(指第四個字符,因爲它不能告訴大家,前三個字節實際上只是一個字符;它假定編碼是單字節的)。