例として次のような文字列のバイト数を求めたいです。
あaいbc54うえ
strlenは正確にバイト数が返ってきませんでした。
mb_strlenでは文字数が返ってきてしまうため、使えません(あくまでもバイト数です。)
結果個人的にmb_strwidthを使うことに行き着いたのですが、mb_strwidthは文字幅を評価する関数と表記されていました。
何パターンか実際にテストしてみた結果mb_strwidthでも動作に支障はなかったのですが、mb_strwidthを使うという方法で
正しいのでしょうか?
もし、バイト数を数えるよい方法がございましたら教えていただきたいです!よろしくお願いします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.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:}
これでどうでしょうか・・・。よく読まなくてホントスイマセン><
No.5
- 回答日時:
まだ受付中でしょうか?
自分も勉強中なので、スマートなソースコードが書けないのですが、こんなのはいかがでしょうか?
$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); # 合計バイト数を実験で画面出力してみる
参考にならなかったらゴメンナサイ…。
No.4
- 回答日時:
そこまで変わっていればあとは、どうするか決めるだけでは?
・文字コードを変更する
・格納する文字数を変更する
・チェック方法を変更する
:
など、仕様に合わせればいいです。
No.3
- 回答日時:
>日本語などが1文字3バイトになってしまいます。
その結果も間違いではありませんよ。
日本語=2バイトではありません。
環境によって2バイトもあれば3バイト、4バイトもあります。
文字コードは何にしていますか?
本当にバイト数を判断するならファイルに保存して
それを読み取ったもの表示してみてください。
その結果とファイルサイズを比較すれば確実です。
この回答への補足
文字コードはUTF-8にしております。
自分でもいろいろと調べたのですが、やはりutf-8ですと3バイトになってしまうようです。
これですと、フォームなどの入力において、全角10文字(半角20文字)以内という設定ができないため困っております。
No.2
- 回答日時:
こんなスクリプトを実行して、予想値と結果とを比べてみてください。
<?php
$str = "あaいbc54うえ";
print "\"$str\"" . "の長さは、" . strlen($str) . "バイトです。<br />";
?>
この回答への補足
提示したいただいたプログラムを実行したところ、
"あaいbc54うえ"の長さは、17バイトです。
となりました。やはり日本語を2バイトではなく、3バイトと処理しているようです。
この状況でしたら、半角英数字=1バイト、日本語系=3バイトと考えてプログラムを組めばよいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」 3 2022/12/15 22:07
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」 5 2022/12/15 10:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# VisualStudioのソースコードで漢字を使いたい 4 2022/05/21 10:16
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
- UNIX・Linux Postfixでドコモメールに送信すると届くまで10分ぐらいかかる 6 2023/03/05 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
バイナリとBCDコード
-
エクセルシート名の制限を変更...
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
ビットスワップとバイトスワッ...
-
1KBが1024byteな理由
-
ピクセル,dpiから容量(バイト...
-
SQLで1バイト、2バイト混在...
-
VBAでUnicodeしか存在しない文...
-
ワイド文字のバイト数が取得で...
-
C++ Builderで文字列をバイトに...
-
varchar(M)のMは文字数ですかバ...
-
バイト境界とは
-
UCS-2の一覧表が欲しい
-
文字数を取得したい
-
バイト列とバイナリ列の違いが...
-
テキストBOXの入力制限について
-
VB2008 2バイト文字の化け字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイナリとBCDコード
-
「1TB」のHDDに日本語は何字入...
-
Javaで日本語1文字のバイト数
-
バイト列とバイナリ列の違いが...
-
SQLで1バイト、2バイト混在...
-
ピクセル,dpiから容量(バイト...
-
C++ Builderで文字列をバイトに...
-
64bit対応
-
ワイド文字のバイト数が取得で...
-
UCS-2の一覧表が欲しい
-
3バイト文字(UTF-8)をprintfで...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
ビットスワップとバイトスワッ...
-
VBSでテキストファイルの文字列...
おすすめ情報