読者です 読者をやめる 読者になる 読者になる

ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

mbを使うべきか

こんにちは、ユアマイスターエンジニアです。

突然ですが、PHPmb系の関数 使いこなしてますか?

使いこなしている方は本日も良い一日をお過ごしください。お気をつけて。



mb系の関数 を使いこなせていないみなさん。

それ!バグを生み出す原因になりかねませんからね!!!


「mb系の関数」ってなんだ

PHP: マルチバイト文字列 関数 - Manual

マルチバイト文字列 を扱うための関数のことです。

そもそもマルチバイト文字ってなによ?

っていう話になるかと思うんですが、それは 文字コード に強く関係する結構難しい話です。

どのくらい難しいかって言うと 文字コード」だけで600ページ超えの本が出るくらい

books.rakuten.co.jp

とてもじゃないですが紹介しきれないのでさっくり飛ばします。

この記事内では暫定的に 「半角英数と基本的な半角記号」以外の文字列 をマルチバイト文字として記述します。

「甘い!」っていうひとは是非寄稿をお願いします

マルチバイト文字を考慮していないために起こりうるバグ

結構ありがちなんですが、ユーザが入力した内容を問い合わせる機能があるとします。

仮にテキストボックスに商品名を入力して検索させるとしましょう。

商品名は全角でも半角でも5文字以上10文字以下とします。

$input = '';
if (isset($this->request->param['product_name'])) {
    $input = $this->request->param['product_name'];
}

if (strlen($input) > 4 && strlen($input) < 11) {
    // 検索したりする
} else {
    throw new BadRequestException('桁数が不正です');
}

こんな感じでしょうか。超ざっくりですが。

この場合、 strlen では「あいう」という入力では例外は発生せず検索処理が実行とされてしまいます。

何故かと言うと

PHP: strlen - Manual f:id:yourmystar_engineer:20170514101842p:plain

文字数ではなく文字のバイト数を取得するからです。

仮にこのシステムがUTF-8で動いていた場合にはバイト数は9バイトとなり、例外は発生しません。

そもそも文字のバイト数を取得する必要がある場合は?

正直なところ、WEBシステムを作っていてバイト数が必要になる場面はあまり多くないかと思います。

(DB周りの制約やファイル・メールのサイズ、厳密なメモリ管理が必要な場合などかな…)

基本的な機能を作る場合は「string系の処理は mb_ をつけよう」と覚えてしまっても良いかもしれません。