ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:文字数を数える方法

帳票出力のために、出力する文字列の長さが全角で20文字を超えたら、強制的に改行をしなければならなくなりました。
文字コードUTF-8なので、strlen()とmb_strlen()では、全角20文字が正しく数えられません。
PHP: strlen - Manual
PHP: mb_strlen - Manual

f:id:AJYA:20180626172249p:plain
unsplash-logoMaybritt Devriese

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()では半角として判定されるという文字があるのかまで調べていないので、思ったとおりの文字数にならない場合があったら、確認が必要になります。