2012-02-24 46 views
3

我想一個UTF8編碼字符串分割成字符數組的數組。我現在使用的功能用於工作,但由於某種原因,它不再工作。可能是什麼原因。更好的是,我該如何解決它?拆分UTF8字符串轉換成字符

這是我的字符串:

Zelf希益瑪珥EEN vraag:魏本JIJ?

這是我的函數:

function utf8Split($str, $len = 1) 
{ 
    $arr = array(); 
    $strLen = mb_strlen($str); 
    for ($i = 0; $i < $strLen; $i++) 
    { 
    $arr[] = mb_substr($str, $i, $len); 
    } 
    return $arr; 
} 

這是結果:

Array 
(
    [0] => Z 
    [1] => e 
    [2] => l 
    [3] => f 
    [4] => 
    [5] => h 
    [6] => e 
    [7] => b 
    [8] => 
    [9] => i 
    [10] => k 
    [11] => 
    [12] => m 
    [13] => a 
    [14] => a 
    [15] => r 
    [16] => 
    [17] => e 
    [18] => ́ 
    [19] => e 
    [20] => ́ 
    [21] => n 
    [22] => 
    [23] => v 
    [24] => r 
    [25] => a 
    [26] => a 
    [27] => g 
    [28] => : 
    [29] => 
    [30] => w 
    [31] => i 
    [32] => e 
    [33] => 
    [34] => b 
    [35] => e 
    [36] => n 
    [37] => 
    [38] => j 
    [39] => i 
    [40] => j 
    [41] => ? 
) 
+1

定義「不工作」。它在做什麼,它不應該在做什麼和/或它沒有做它應該做的事情? – 2012-02-24 21:20:48

+0

該ee部分沒有分裂,因爲它應該 – tersmitten 2012-02-25 07:35:36

+0

SOLUTION:http://stackoverflow.com/a/21654160/2377343 – 2016-01-24 17:14:31

回答

1

我發現了é不是我期望的字符。顯然,né和ñe是有區別的。我把它通過normalizing工作的第一線。

10

對於mb_...功能,您應該指定字符集編碼。

在您的示例代碼,這些都是特別是以下兩行:

$strLen = mb_strlen($str, 'UTF-8'); 
$arr[] = mb_substr($str, $i, $len, 'UTF-8'); 

的全貌:

function utf8Split($str, $len = 1) 
{ 
    $arr = array(); 
    $strLen = mb_strlen($str, 'UTF-8'); 
    for ($i = 0; $i < $strLen; $i++) 
    { 
    $arr[] = mb_substr($str, $i, $len, 'UTF-8'); 
    } 
    return $arr; 
} 

因爲你使用UTF-8在這裏。然而,如果輸入不正確編碼,這是不行的「不再」 - 只是因爲它沒有被設計成別的東西。

可以alternativly過程UTF-8編碼字符串與PCRE正則表達式,例如這將返回你在更少的代碼找什麼:

$str = 'Zelf heb ik maar één vraag: wie ben jij?'; 

$chars = preg_split('/(?!^)(?=.)/u', $str); 

下一步preg_split還有mb_split

+0

我與全局指定編碼:mb_internal_encoding(「UTF-8」); – tersmitten 2012-02-25 07:37:05

+0

這應該設置它(但還設置HTTP的輸入和輸出的編碼),你可以分析字符串(例如,[有hexdump都(http://stackoverflow.com/questions/1057572/how-can-i-get-一,十六進制轉儲的-A-字符串中的PHP)),並檢查字符串編碼的第一手資料,我懷疑任何的編碼設置爲不正確或字符串的字符集編碼是UTF-8以外別的東西。 – hakre 2012-02-25 13:50:47

0
mb_internal_encoding("UTF-8"); 

46陣列 - 關41個陣列

4

如果你不知道mb_string函數庫的可用性,然後使用:

版本1:

function utf8_str_split($str='',$len=1){ 
    preg_match_all("/./u", $str, $arr); 
    $arr = array_chunk($arr[0], $len); 
    $arr = array_map('implode', $arr); 
    return $arr; 
} 

版本2:

function utf8_str_split($str='',$len=1){ 
    return preg_split('/(?<=\G.{'.$len.'})/u', $str,-1,PREG_SPLIT_NO_EMPTY); 
} 

兩個函數在PHP5

10
測試

這是最好的解決辦法!:

我發現在這個PHP manual pages很好的解決方案。

preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY); 

它的工作原理非常快:

在PHP 5.6.18它幾秒鐘內拆分6 MB大的文本文件。

最重要的。它不需要MultiByte(mb_)支持!

類似的回答也here