我需要从一个单词中获取一个包含所有字符的数组,但是当我执行以下代码时,该单词具有特殊编码的字母,如á,
$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)“á”}
答案 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.html 和 http://akrabat.com/php/utf8-php-and-mysql/ 还有更多可以找到...
答案 2 :(得分:0)
你应该对所有多字节字符集使用多字节函数!我猜mb_split是吊坠:
答案 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);