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]=> string(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.htmlhttp://akrabat.com/php/utf8-php-and-mysql/ など、他にもたくさんあります...

于 2012-11-21T20:46:16.593 に答える
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 に答える
0

すべてのマルチバイト文字セットにマルチバイト関数を使用する必要があります! 私は mb_split がペンダントだと思います:

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

于 2012-11-21T20:51:00.487 に答える