2016-05-11 4 views
0

私はこのコードを持っていません。特殊文字は出力が正しく

$line = 'ABBEKÅS'; 
echo 'word is '.$line.PHP_EOL; 
for($i=0;$i<strlen($line);$i++){ 
    echo 'char '.$line[$i].PHP_EOL; 
} 

を結果は次のとおりです。単一の文字はそうではない

word is ABBEKÅS 
char A 
char B 
char B 
char E 
char K 
char ? 
char ? 
char S 

はなぜ言葉が良く見えますか? 私は両方ともutf-8とISOの両方を役に立たないものに変換しようとしました。これは私が試したものです:

$line = iconv("UTF-8", "ISO-8859-1", $line); 

$line = iconv("ISO-8859-1", "UTF-8", $line); 

結果はまだ同じです。

+1

あなたはforループの中で各文字が1バイトだけであると仮定しているので(あなたは一度に1文字ずつバイトを繰り返します)、あなたのÅはマルチバイト文字 –

答えて

1

あなたは、各文字がループのためのあなたの唯一のシングルバイト(一度に時間、ない文字バイトを反復している)であると仮定している、とあなたÅはマルチであるため、バイト文字。あなたがPHPのmultibyte string functions

for($i=0;$i<mb_strlen($line);$i++){ 
    echo 'char '.mb_substr($line, $i, 1).PHP_EOL; 
} 

Demo

0

を使用し、セグメント/文字にマルチバイト文字列を分割する必要がある場合は

だから、解決策はmb_substrで文字を取得することです。これは次のようになります:

$line = 'ABBEKÅS'; 
echo 'word is '.$line.PHP_EOL; 
for($i=0;$i<strlen($line);$i++){ 
    echo mb_substr($line, $i, 1).PHP_EOL; 
}