北青山通信 – from aoyama » 全角文字は2バイトではないのでした。

全角文字は2バイトではないのでした。

タイトルの件、考えてみれば当たり前なのですが、お客さんからの仕様で引っかかりました。ここでいう全角文字は、マルチバイト文字のこと。

フォームに文字を入力する処理で、入力した文字の長さをチェックする処理が必要です。そこで文字長でチェックするか、バイトでチェックするか。

これをCakePHPのバリデーションで用意しているmaxLengthのルールでチェックしたところ、何も考えずに内部コードのバイト長でチェックしていまいます。これをお客様から指摘されました。希望としては、全角文字を2バイトでチェックして欲しいとのこと。

例えば、「あああ」は6バイトではなく9バイトとして判定されます。これは内部のコードがUTF-8だからです。CakePHPのバリデーションで正しく文字数で判定するには、maxLengthの処理をmb_strlen()で変更してあげます。詳細な対応方法は、こちらのサイトをご覧ください。

ここで簡単な実験です。こんなコードと結果です。

<?php

$str = "あああ";

echo(strlen($str)); // 9

echo(mb_strlen($str));  // 9

echo(mb_strlen($str, ‘UTF-8′));  // 3

echo(mb_strlen(mb_convert_encoding($str, ‘SJIS’, ‘UTF-8′), ‘SJIS’)); // 3

echo(strlen(mb_convert_encoding($str, ‘SJIS’, ‘UTF-8′)));  // 6

?>

UTF-8のままですと、全角文字は2バイトにはなりません。しかも、正しく文字コードをしてあげないと正しい文字数になりません。

一旦、シフトJISに変換してあげて、mb_stringではないstrlen()で全角文字を2バイトで計算してくれます。

昔の人間ですと、どうしても全角=2バイト、半角=1バイトと考えてしまうのですが、この考え方は古いかもしれませんね。

トラックバックURL

3 コメント

  • 1. 北青山通信 - from ao&hellip 登録時刻 2008年10月17日 金曜日 00:46 :

    [...] 変でした。それでも、validates()のおかげで数は多いのですが、まとまって見やすいです。先日の全角の文字数の判定の件もありましたが、正規表現でのチェックもたくさん使っています。 [...]

  • 2. 浜村拓夫の世界&hellip 登録時刻 2009年09月29日 火曜日 10:29 :

    PHPのstrlen関数で全角文字が3バイトになる件

    PHPのstrlen関数で、文字列のバイト数を取得しようとしたら、全角文字1文字が2バイトではなく3バイトとしてカウントされてしまった。
    全角文字の…

  • 3. 浜村拓夫 登録時刻 2009年09月29日 火曜日 10:31 :

    参考になりました!
    どうもありがとうございます。(・∀・)

コメント

XHTML: 次のタグを使用可能です。: <a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <code> <em> <strong>