帳票出力のために、出力する文字列の長さが全角で20文字を超えたら、強制的に改行をしなければならなくなりました。
文字コードがUTF-8なので、strlen()とmb_strlen()では、全角20文字が正しく数えられません。
PHP: strlen - Manual
PHP: mb_strlen - Manual
Shift_JISに変換する?
Shift_JISであれば全角2バイト、半角1バイトでわかるので、全角換算の文字数は、バイト数/2でわかります。
こんな感じでしょうか。
$str = mb_convert_encoding($str "SJIS-win", "UTF-8"); $len = strlen($str); $count = $len / 2;
mb_strwidth()を利用する
上記でもよかったのですが、手間がかかるのでもっと適切な方法がないかとPHPのマニュアルを読むとありました。
PHP: mb_strwidth - Manual
$len = mb_strwidth($str, "UTF-8"); $count = $len / 2;
今回はこちらの方法を採用しました。
「全角文字は次のとおりです。」と文字コードの記載がマニュアルにはあります。
Shift_JISでは全角だけど、mb_strwidth()では半角として判定されるという文字があるのかまで調べていないので、思ったとおりの文字数にならない場合があったら、確認が必要になります。