【问题标题】:Split utf8 string into array of chars将 utf8 字符串拆分为字符数组
【发布时间】:2012-03-15 08:10:14
【问题描述】:

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

这是我的字符串:

Zelf heb ik maar één vraag: 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] => ?
)

【问题讨论】:

  • 定义“不起作用”。它在做什么它不应该做和/或它没有做什么它应该做的事情?
  • éé 部分未按应有的方式拆分

标签: php utf-8


【解决方案1】:

PHP中有一个多字节拆分功能,mb_split

【讨论】:

  • 一定要设置mb_regex_encoding()
【解决方案2】:

对于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。但是,如果输入没有正确编码,这将“不再”起作用 - 只是因为它不是为其他目的而设计的。

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

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

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

preg_split旁边还有mb_split

【讨论】:

  • 我在全局范围内指定编码:mb_internal_encoding('UTF-8');
  • 应该设置它(但它也设置HTTP输入和输出编码),您可以分析字符串(例如with a hexdump)并直接检查字符串编码,我怀疑编码设置不是对或字符串的字符集编码不是 UTF-8。
【解决方案3】:
mb_internal_encoding("UTF-8"); 

46 个数组 - 关闭 41 个数组

【讨论】:

  • 你能澄清一下这个答案吗?
【解决方案4】:

我发现 é 不是我所期望的字符。显然,né 和 ńe 是有区别的。我首先通过normalizing 字符串使其工作。

【讨论】:

    【解决方案5】:

    如果您不确定 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 中测试的两个函数

    【讨论】:

      【解决方案6】:

      这是最好的解决方案!:

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

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

      它运行得非常快:

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

      最好的。它不需要多字节 (mb_) 支持!

      类似的答案还有here

      【讨论】:

        猜你喜欢
        • 2012-02-22
        • 2016-04-01
        • 2011-01-10
        • 1970-01-01
        • 2012-06-27
        • 1970-01-01
        相关资源
        最近更新 更多