3

文字列を文字ごとに分解しようとしていますが、特殊文字に問題があります。現在、次の機能を使用しています。

<?php
$input = "Comment ça va?";
$array_input = str_split($input, 1);
print_r($array_input);
?>

出力は次のとおりです。

Array (
[0] => C [1] => o [2] => m [3] => m [4] => e
[5] => n [6] => t [7] => [8] => � [9] => �
[10] => a [11] => [12] => v [13] => a [14] => ? )

改行についても同じ問題があります。

入力:
「へ!
おい?」

出力:

Array ( [0] => H [1] => � [2] => � [3] => ! [4] => 
[5] => [6] => O [7] => u [8] => i [9] => ? )

この問題の解決策はありますか? どうもありがとう。

4

2 に答える 2

3

str_splitUnicode文字列に問題があります。

代わりにu修飾子を使用できますpreg_split

例えば:

$input = "Comment ça va?";
$letters1 = str_split($input);
$letters2 = preg_split('//u', $input, -1, PREG_SPLIT_NO_EMPTY);

print_r($letters1);
print_r($letters2);

出力します

Array ( [0] => C [1] => o [2] => m [3] => m [4] => e 
        [5] => n [6] => t [7] => [8] => � [9] => � 
        [10] => a [11] => [12] => v [13] => a [14] => ? ) 

Array ( [0] => C [1] => o [2] => m [3] => m [4] => e 
        [5] => n [6] => t [7] => [8] => ç [9] => a 
        [10] => [11] => v [12] => a [13] => ? ) 
于 2012-04-29T14:46:20.503 に答える
2

これは、PHPのstr_split関数がマルチバイトセーフではないためです。つまり、Unicodeを正しく処理できないためです。代わりにこの関数を使用できます。これは、マルチバイトセーフな実装です。str_split

function mb_str_split( $string ) { 
    # Split at all position not after the start: ^ 
    # and not before the end: $ 
    return preg_split('/(?<!^)(?!$)/u', $string ); 
} 

(出典:PHPドキュメントのユーザーコメント)

于 2012-04-29T14:48:09.490 に答える