如何从具有特殊编码的单词中获取每个字符

时间:2012-11-21 20:42:26

标签: php encoding character-encoding tokenize

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

$word = 'withá';

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

$word_arr = str_split($word);

我明白了:

  

array(6){[0] =&gt; string(1)“w”[1] =&gt; string(1)“i”[2] =&gt; string(1)“t”   [3] =&GT; string(1)“h”[4] =&gt; string(1)“Ô[5] =&gt; string(1)“¡”}

如何获取以下每个角色?

  

array(5){[0] =&gt; string(1)“w”[1] =&gt; string(1)“i”[2] =&gt; string(1)“t”   [3] =&GT; string(1)“h”[4] =&gt; string(1)“á”}

4 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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.htmlhttp://akrabat.com/php/utf8-php-and-mysql/ 还有更多可以找到...

答案 2 :(得分:0)

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

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

答案 3 :(得分: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);