アプリ版:「スタンプのみでお礼する」機能のリリースについて

例として次のような文字列のバイト数を求めたいです。
あaいbc54うえ

strlenは正確にバイト数が返ってきませんでした。
mb_strlenでは文字数が返ってきてしまうため、使えません(あくまでもバイト数です。)

結果個人的にmb_strwidthを使うことに行き着いたのですが、mb_strwidthは文字幅を評価する関数と表記されていました。
何パターンか実際にテストしてみた結果mb_strwidthでも動作に支障はなかったのですが、mb_strwidthを使うという方法で
正しいのでしょうか?

もし、バイト数を数えるよい方法がございましたら教えていただきたいです!よろしくお願いします。

A 回答 (6件)

すっすいません。

質問を勘違いしてました。。。
バイト数じゃなくて全角10文字、半角20文字、でしたね。。。
えええと、とりあえずループ文の中で以下のような処理を行うとか…。
01:$max_length = 20; # 半角なら最高20文字入るので
02:$input_length = 0;
03:$string = "あaいbc54うえ"; # サンプル文字列
04:$encode = mb_detect_encoding($string); # 文字コード取得
05:for($i=0;$i<mb_strlen($string,$encode);$i++){ # 文字数分ループの繰り返し
06: $input_length = ((strlen(mb_substr($string,$i,1,$encode))!=1)?2:1) + $input_length;
07:}
08:if($input_length > $max_length){
09: echo "文字数制限オーバー";
10:}

これでどうでしょうか・・・。よく読まなくてホントスイマセン><
    • good
    • 0

まだ受付中でしょうか?


自分も勉強中なので、スマートなソースコードが書けないのですが、こんなのはいかがでしょうか?
$bytes = 0; # バイト数取得
$string = "あaいbc54うえ"; # サンプル文字列
$encode = mb_detect_encoding($string); # 文字コード取得

for($i=0;$i<mb_strlen($string,$encode);$i++){ # 文字数分ループの繰り返し
$bytes += strlen(mb_substr($string,$i,1,$encode)); # 1文字ずつ取り出してそれぞれのバイト数を調べて$bytesに加算
}
var_dump($bytes); # 合計バイト数を実験で画面出力してみる

参考にならなかったらゴメンナサイ…。
    • good
    • 0

そこまで変わっていればあとは、どうするか決めるだけでは?


・文字コードを変更する
・格納する文字数を変更する
・チェック方法を変更する
    :

など、仕様に合わせればいいです。
    • good
    • 0

>日本語などが1文字3バイトになってしまいます。


その結果も間違いではありませんよ。
日本語=2バイトではありません。
環境によって2バイトもあれば3バイト、4バイトもあります。
文字コードは何にしていますか?
本当にバイト数を判断するならファイルに保存して
それを読み取ったもの表示してみてください。
その結果とファイルサイズを比較すれば確実です。

この回答への補足

文字コードはUTF-8にしております。
自分でもいろいろと調べたのですが、やはりutf-8ですと3バイトになってしまうようです。

これですと、フォームなどの入力において、全角10文字(半角20文字)以内という設定ができないため困っております。

補足日時:2008/07/17 21:55
    • good
    • 0

こんなスクリプトを実行して、予想値と結果とを比べてみてください。




<?php
$str = "あaいbc54うえ";
print "\"$str\"" . "の長さは、" . strlen($str) . "バイトです。<br />";
?>

この回答への補足

提示したいただいたプログラムを実行したところ、
"あaいbc54うえ"の長さは、17バイトです。
となりました。やはり日本語を2バイトではなく、3バイトと処理しているようです。

この状況でしたら、半角英数字=1バイト、日本語系=3バイトと考えてプログラムを組めばよいでしょうか?

補足日時:2008/07/17 00:02
    • good
    • 0

>strlenは正確にバイト数が返ってきませんでした。


それは、どういうようにして確認しました?
私の時は、strlenの結果はバイト数になりましたよ。

mb_strwidthは内容によってバイト数にならない事があります。

この回答への補足

ご回答ありがとうございます。
サーバによって変わるようです。現在、使用しているレンタルサーバではstrlenでは、日本語などが1文字3バイトになってしまいます。

違うサーバで試した結果は上手くいきました。汎用的に使える方法をご存知でしょうか?

補足日時:2008/07/16 23:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!