2012-02-24 50 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