8

我需要从一个单词中获取一个包含所有字符的数组,但是当我执行以下代码时,该单词具有特殊编码的字母,例如á:

$word = 'withá';

$word_arr = array();
for ($i=0;$i<strlen($word);$i++) {
    $word_arr[] = $word[$i];
}

或者

$word_arr = str_split($word);

我得到:

数组(6) { [0]=> 字符串(1) "w" [1]=> 字符串(1) "i" [2]=> 字符串(1) "t" [3]=> 字符串(1) "h" [4]=> 字符串(1) "Ã" [5]=> 字符串(1) "¡" }

我怎样才能获得每个字符如下?

数组(5) { [0]=> 字符串(1) "w" [1]=> 字符串(1) "i" [2]=> 字符串(1) "t" [3]=> 字符串(1) "h" [4]=> 字符串(1) "á" }

4

4 回答 4

3

因为它是一个 UTF-8 字符串,所以只做

$word = 'withá';
$word = utf8_decode($word);
$word_arr = array();
for ($i=0;$i<strlen($word);$i++) {
    $word_arr[] = $word[$i];
}

这样做的原因是,即使它在您的脚本中看起来正确,解释器也会将其转换为多字节字符(为什么mb_split()也可以)。要将其转换为正确的 UTF-8 格式,您可以使用 mb 函数或仅指定utf8_decode().

于 2012-11-21T20:52:45.857 回答
2

我认为 mb_split 会为你做的:http ://www.php.net/manual/en/function.mb-split.php

如果您使用特殊编码,您可能想了解 PHP 通常如何处理多字节编码...

编辑:不,不知道如何让 mb_split 自己做,但是环顾四周,有一些其他问题得到了 preg_split 的回答。我对此进行了测试,它似乎完全符合您的要求:

preg_split('//',$word,-1,PREG_SPLIT_NO_EMPTY);

不过,我仍然强烈建议您阅读 PHP 中的多字节字符。恕我直言,这有点乱。

这里有一些很好的链接: http ://www.joelonsoftware.com/articles/Unicode.html 和 http://akrabat.com/php/utf8-php-and-mysql/ 还有更多可以找到...

于 2012-11-21T20:46:16.593 回答
0

您应该对所有多字节字符集使用多字节函数!我猜 mb_split 是吊坠:

http://php.net/manual/en/function.mb-split.php

于 2012-11-21T20:51:00.487 回答
0

如发现:http ://www.php.net/manual/en/function.str-split.php#107658

    function str_split_unicode($str, $l = 0) {
        if ($l > 0) {
            $ret = array();
            $len = mb_strlen($str, "UTF-8");
            for ($i = 0; $i < $len; $i += $l) {
                $ret[] = mb_substr($str, $i, $l, "UTF-8");
            }
            return $ret;
        }
        return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
    }

   $word = 'withá';
   $word = str_split_unicode($word);
   var_dump($word);
于 2012-11-21T20:52:46.553 回答