- ベストアンサー
mb_strlen関数を使用したエラーチェックで文字数判定がおかしい理由
- PHPのmb_strlen関数はマルチバイト文字数をカウントするため利用されますが、実際には半角文字の2倍のバイト数を返します。
- 質問者は指定した100文字以内の入力を許したいのに、mb_strlen関数を使用して51文字以上をチェックしても、半角文字数で判定されるためエラーメッセージが表示されます。
- 解決策としては、mb_strlen関数の第2引数を指定することで正しい文字数のカウントが行われるため、mb_strlen($check_data['name'], 'UTF-8')のようにUTF-8を指定する必要があります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Shift-JISは文字コードの一部に¥を含むため、殆どのUNIX系サーバでは内部文字コードとして採用していないはず(EUC又はUTF-8が一般的です)なのですが・・・。 インターネット経由でのアクセスであれば、ブラウザ側の文字コードがSJISであっても、ブラウザが送信時に文字コードを変換してUTF-8(殆どこれです)を送信しているはずです。受け取ったHTTPサーバはUTFをHTTPサーバの設定ファイルで指定されているコードに変換した後、PHPへ入力文字を渡します。 PHPは受け取った文字をPHPの設定ファイルで指定してある文字コードに変換して、プログラムを実行します。 ですから、PHPの内部コードと、ブラウザで使用している内部コードは一致していないと思われます。 PHPの内部コードを確認したほうが良さそうですね。
その他の回答 (3)
- memphis
- ベストアンサー率40% (975/2395)
文字の判断で勘違いしていませんか? mb_strlenは、文字数を数えるのであってバイト数を数えるわけではありません。 だから”>100”としていると言うことは 日本語も含めて100文字で、バイト数で100バイトではありません。
- php504
- ベストアンサー率42% (926/2160)
入力された文字のコードがSJISではないのかもしれませんね
補足
既に、レンタルサーバーにファイルをアップして、 テストを何回も行っております。 そのため、ページ自体はほぼ完成し、 入力そのものも、ブラウザのテキスト入力フォームから 文字を受け取るようにしています。 その入力は、SJISでの入力にはなっていないということでしょうか?
- show5-love
- ベストアンサー率40% (4/10)
>ちなみに上のコードは、>100 としつつ、出力分は50文字以内としております。 なんだかすっきりしません。 ソースコードを作成されたのはご本人ですか?
補足
はい、自分でやりましたが、 でも、その考え方は、書籍を参考にしました。 書籍では、>100 となっていまして、 判定もきちっと>100で正確に100文字で判定を受けるようで、 エラー出力文も、 "100文字以内でご入力下さい" となっております。
お礼
長い間、お礼を申し上げるのが遅れてしまい。 誠に申し訳御座いませんでした。 そして有難うございました。 無事、解決いたしました。 htaccseeにて、PHPの内部コードを設定して解決しました。 有難うございました!!!