JISコードでstrlenの文字数が合わない(目視の文字数とstrlenの文字数が異なる)

文字コードをJISにしたものをShift-JISなどのページで表示すると、英文字と記号が表示されます。
この文字をstrlenでカウントすると、表示されている文字数を目視で数えたときと文字数が違うことがあります。

<?php
$str = "あいうえおかきくけこ";
$str = mb_convert_encoding($str,"JIS","SJIS-win");
echo $str ;
echo "<br />";
echo strlen($str);

『あいうえおかきくけこ』をJISコードにすると『$B$"$$$&$($*$+$-$/$1$3(B』で24文字ですが、strlenだと26文字になります。

これはstrlenのバグではありません。
あとの2文字はブラウザで表示されていないだけです。

[参考記事] echoしても文字は表示されないのに、emptyがtrueにならない

文字コードで出力するとわかります。

<?php
$str = "あいうえおかきくけこ";
$str = mb_convert_encoding($str,"JIS","SJIS-win");
for ($i = 0; $i < strlen($str); $i++){
  $char = substr ( $str, $i, 1 );
  echo bin2hex($char);
  echo " ";
}

1b 24 42 24 22 24 24 24 26 24 28 24 2a 24 2b 24 2d 24 2f 24 31 24 33 1b 28 42

このように表示されます。
この『0x1b』はブラウザ画面で表示されない文字で、『ESC(エスケープ)』をあらわします。

またテキストエディタによってはコピペしたときに最後の『(B』部分がペーストできないことがあります。
コピーしたときには『0x1b』を含めてクリップボードに保存されますが、ペーストするとこの部分で終了するため、それ以降の『(B』がペーストできないという現象が起こります。

関連記事

スポンサーリンク

mailtoの使い方

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る