2013-07-31 17 views
0

我有一堆字符串與不同的字符集。變量$charset包含當前字符串的字符集。安全地使用UTF-8字符串的strpos?

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

完成這一操作,是可以安全使用的strposstrlensubstr諸如此類,而不是他們多字節等同?我問這個,因爲我也使用preg_match。因此,如果我使用PREG_OFFSET_CAPTURE來獲取字符串中單詞的位置,我不能使用該值與mb_substr來刪除單詞前的所有內容。

回答

2

這完全取決於你想要做什麼。核心strlen和類似的功能在字節上工作。他們接受並返回的每個數字都是一個字節計數或字節偏移量。 mb_ *函數在字符上工作,可識別編碼。他們接受並返回的所有數字都是字符數或偏移量。

如果您有一種安全的方法來獲取字符串中的字節偏移量(「安全」意味着偏移量不在多字節字符的中間),然後例如使用substr裁剪該偏移量之前的所有內容,這將工作得很好。例如:

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

工作正常。

然而,這是不行的:

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

你不能安全地切割出一個字節不運行切成多字節字符的風險。

+0

所以,如果我通過使用'prey_match'來獲得單詞的位置,你可以說這是一種「安全」的方式?意思是不可能切成多字節字符。 –

+0

是的,如果你得到一個字符的位置作爲字節偏移量,並在那個點和其他地方完全切斷,那麼在UTF-8編碼中這是一個安全的操作。 – deceze

0

函數像strlen()計數字節,而不是字符。

看到PHP Manual筆記的詳細信息:

注:

的strlen()返回的字節數,而不是字符的字符串中的數量。

使用mb_*功能,如果你使用UTF-8的工作,除非你有啓用重載標準吊索(php.ini中mbstring.func_overload),strlen的(),SUBSTR()等函數..然後strlen()會計算字符數

+0

但是如果我用'preg_match'和'PREG_OFFSET_CAPTURE'來找到一個單詞並且我得到多個匹配,我該怎麼辦?我想使用'mb_substr'去除單詞前的所有內容。它不修剪字符串,如果它是UTF-8字符之前的字符,因爲'preg_match'在我的情況下得到一個不正確的位置。 –

+0

如果您正在使用preg_match(),請將其與multibyte/u限定符一起使用;並希望你有一個支持多字節字符集的pcre版本 –