Perl CGI でフォームからの絵文字入力を制限する方法

Perl の CGI で携帯端末用のフォームからの絵文字入力を制限する方法を紹介します(3キャリア対応)。

同じ手法で、機種依存文字の制限などを行えます。

文字コードは Shift_JIS の想定です。
Softbank の 3G端末ではまた別の対応が必要になります。これについては別に書きます。
(初出は Vodafone 時代で、この当時の端末を対象にしています。)

絵文字入力制限処理のポイント

ダブルバイト文字のマッチ

絵文字コード範囲が分れば正規表現で制限できますが、連続したダブルバイト文字の「後半+前半」にマッチしてしまわないような配慮が必要です。

エラー画面での、Vodafone 絵文字コードへの配慮

フォーム入力で絵文字の制限を行い、エラーがあった場合再度同じ入力フォーム画面を返す場合、入力された文字のエンティティ変換が必要ですが、Vodafone 端末が送信してくる絵文字コードには、通常エンティティ変換の対象となる「"」や「&」が含まれているのでこれまで変換してしまわないようにします。
(出現する「"」や「&」を全てエンティティ変換してしまうと、エラー画面でなぜか絵文字が増殖?!という事態になります。)

※「エンティティ変換」とは
「<」を「&lt;」に変換するなど、HTML 上の特殊文字を別の表記にすること。
フォーム入力される範囲の文字列の場合、「<」や「>」が残っていても意図通り値の入力された内容の一部と認識してくれる端末はありますが、最低限「"」はエンティティ変換しておかなければなりません。