如何使用特殊编码获取单词中的每个字符

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) “á”}

提示:您可以使用PHP的mb_convert_encoding函数将编码转换为正确的格式。
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()

2
我认为mb_split可以为您完成此操作:http://www.php.net/manual/en/function.mb-split.php 如果您使用特殊编码,则可能希望了解PHP如何处理多字节编码。
编辑:不,我无法弄清楚如何使mb_split自己完成此操作,但在SO上找到了一些其他问题,这些问题通过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/ 还有很多其他的链接可以找到...

你推荐在这种情况下使用哪个$pattern(mb_split函数的第一个参数)? - leticia
1
mb_split并不完全符合需求。它只能基于正则表达式进行分割,而不能直接将字符串分割成字符数组。然而,在该函数页面的评论区中间,有一个可以满足需求的函数。 - G-Nugget
@G-Nugget - 很好的观点,即使有点违反直觉。我也无法让它起作用,并已修改了我的答案。 - Aerik

0

来源于:http://www.php.net/manual/zh/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);

不起作用,返回值为:array(5) { [0]=> string(1) "w" [1]=> string(1) "i" [2]=> string(1) "t" [3]=> string(1) "h" [4]=> string(2) "á" } - leticia
很奇怪,在我的服务器上我得到了:array(5) { [0]=> string(1) "w" [1]=> string(1) "i" [2]=> string(1) "t" [3]=> string(1) "h" [4]=> string(2) "á" } - Slavenko Miljic
@leticia2602 - 我猜测你的文件没有使用utf-8编码保存 - 如果Tim Withers的答案对你有用,而这个答案不行,那么你的文件可能是用其他编码方式编码的。尝试使用一个编辑器(比如Notepad2),让你指定编码方式。 - Aerik
@Slave 我的 PHP 版本是 5.3.10-1ubuntu3.4。 - leticia
@Aerik 我正在使用 Collation: utf8_general_ci 从 MySql 表中获取值。 - leticia
@leticia2602 好的 - 我认为你仍然需要在MySQL中执行 SET NAMES UTF8;,并且我认为你应该将PHP源代码文件编码为UTF-8。 - Aerik

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接