PHPで全角文字が含まれているかどうかのチェック

文字列に全角文字が含まれているかどうか(半角文字のみではないか)を確認する方法。


文字列の長さを取得するmb_strlen。
説明
mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
文字列の長さを取得します。

(中略)

文字エンコーディング encoding の文字列 str の文字数を返します。 マルチバイト文字の一文字は1個として数えられます。
引用元:PHP(http://php.net/manual/ja/function.mb-strlen.php)


文字列の幅を取得するmb_strwidth。
説明
int mb_strwidth ( string $str [, string $encoding = mb_internal_encoding() ] )
文字列 str の幅を返します。

マルチバイト文字は、通常はシングルバイト文字の倍の幅となります。

文字の幅

文字
U+0000 - U+00190
U+0020 - U+1FFF1
U+2000 - U+FF602
U+FF61 - U+FF9F1
U+FFA0 - 2
引用元:PHP(http://php.net/manual/ja/function.mb-strwidth.php)


mb_strlenはシングルバイト文字・マルチバイト文字ともに1としてカウント。
mb_strwidthは原則シングルバイト文字=1、マルチバイト文字=2(シングルバイトの倍)としてカウント。

なので取得した文字列の長さとmb_strwidthで取得した文字列の幅が同じであればすべて半角。
文字列の長さ*2と文字列の幅が同じであればすべて全角。どちらにも当てはまらなければ全角文字と半角文字が混在。

  1. $str = "確認したい文字列";
  2. $len = mb_strlen($str, "UTF-8");
  3. $wdt = mb_strwidth($str, "UTF-8");
  4. if($len == $wdt) {
  5. // すべて半角の場合
  6. } elseif($len * 2 == $wdt) {
  7. // すべて全角の場合
  8. } else {
  9. // 全角・半角が混在している場合
  10. }

mb_strwidthはUnicodeのブロック別に幅が決まっているので、全角表示されていても文字幅は1として扱われる場合もある。
(例えばギリシア文字やキリル文字はフォントによっては全角表示だけれど、U+0020 - U+1FFFに含まれるので文字幅は1)

参考:
Category:Unicode表 - Wikipedia
https://ja.wikipedia.org/wiki/Category:Unicode表