将utf8字符串拆分为字符数组

时间:2012-02-24 21:15:06

标签: php utf-8

我正在尝试将 utf8 编码的字符串拆分为字符数组。我现在使用的功能用于工作,但由于某种原因它不再起作用。可能是什么原因。更好的是,我该如何解决?

这是我的字符串:

  

Zelf heb ikmaaréénvraag:wie ben 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] => ?
)

6 个答案:

答案 0 :(得分:14)

这是最好的解决方案!:

我在PHP manual pages找到了这个不错的解决方案。

my_list

它运作得非常快:

在PHP 5.6.18中,它会在几秒钟内分割出一个6 MB的大文本文件。

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

类似的答案here

答案 1 :(得分:11)

对于mb_...函数,您应指定charset编码。

在您的示例代码中,这些特别是以下两行:

$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。但是,如果输入没有正确编码,那么这将不再“工作” - 只是因为它没有为其他东西设计。

您可以使用PCRE正则表达式替代地处理UTF-8编码的字符串,例如,这将以较少的代码返回您要查找的内容:

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

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

preg_split旁边还有mb_split

答案 2 :(得分: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中测试了这两个函数

答案 3 :(得分:2)

PHP中有一个多字节分割函数,mb_split

答案 4 :(得分:1)

我发现é不是我期望的角色。显然,né和ñe之间存在差异。我首先通过normalizing字符串工作。

答案 5 :(得分:0)

mb_internal_encoding("UTF-8"); 

46个数组 - 关闭41个阵列