学習した事をアウトプットするためいんQiita投稿しています。
学習中ユーザーが書いた記事になります。
[ビット・バイト]について学習した理由は、
strlen関数、mb_strlen関数(簡単に文字列を数える)関数について理解を深めたかったから。
ビットとは
ビットとは、0か1が入る箱の事。
つまり、
1ビット・・・0、1(2通り)
2ビット・・・01、10、00、11 (4通り)
3ビット・・・000、001、010、011、100、101、110、111(8通り)
4ビット・・・16通り
5ビット・・・32通り
それでは問題。
16ビットは何通りでしょうか。
ヒント:
・1ビットで表現できるのは0、1の2通り
・ビットパターンは0、1の2通り
正解は下記 「【基本】シングルバイトとは」に記載。
上記を見ていただいたら分かる通り、1ビット増えるごと、倍のデータ量となります。
【基本】バイトとは
バイトとは、0か1が入る箱(ビット)が8つくらい入る大きな箱の事。
補足:
基本的には1バイト=8ビット
ただ、
・1バイト=9ビット
・1バイト=7ビット
ともなるようですが、「基本的」の部分だけ学習して覚えていきます。
【基本】マルチバイトとは
2バイト以上のこと。
マルチとは複数という意味です。つまり、2バイト以上(複数)でマルチバイトと呼びます。
1バイト=256通りで表現出来ない情報量をマルチバイトと呼びます。
【基本】シングルバイトとは
シングルバイトとは、1バイトの事を呼びます。
シングルとは一つという意味です。
1バイトで表現できる情報量は8ビット=256通りです。
16ビットの答えは
「65536通り」
strlen関数,mb_strlen関数
冒頭でお伝えした
strlen関数、mb_strlen関数を使用してビット、バイト理解を深める。
補足:読み方間違えてるかもしれませんが、
・strlen(ストアレン)関数
・mb_strlen(マルチバイトストアレン)関数
strlen関数とは・・・文字列の長さのバイト数を返す(出力する)。
mb_strlen関数とは・・・日本語などのマルチバイト(複数)の文字列をカウントする。
strlen関数と、mb_strlen関数ではどのように違うのか実証!
mb_strlen関数
$i = '初めまして';
var_dump(mb_strlen($i,'utf8'));
出力結果:int(5)
ーーーーーーーーーーーーーーーーーーーーーーー
$i = 'ABC123A';
var_dump(mb_strlen($i));
出力結果:int(7)
strlen関数
$i = '初めまして';
var_dump(strlen($i));
出力結果:int(15)
ーーーーーーーーーーーーーーーー
$i = 'ABC123A';
var_dump(strlen($i));
出力結果:int(7)
アルファベットはしっかり文字列がカウントされているのに対して、
日本語は違う結果が返ってきました。
初めまして=5文字です。
mb_strlen関数では5文字とカウントされているのに対して、
strlen関数は15文字とカウントされています。
どうして?
多くの日本語は1文字=3バイト[24ビット]の情報量となっています。
また、半角英数字・・・1文字=1バイト[8ビット]
となっています。
つまり、
strlen関数・・・上記で説明した様に、[バイト数]を返すため日本語1文字3バイトのため
日本語文字数5*1文字3バイト=結果(15)と返ってくる。
mb_strlen関数・・・マルチバイト文字列に対して[文字列の長さ]を返すため結果(5)
ただし、mb_strlen関数 気をつける事
こちらにも記載しています。
https://www.php.net/manual/ja/function.mb-strlen.php
第二引数にエンコードを指定した方が良いよって事です。
これについて他記事も見ましたが、つまりは
第二引数は省略可能ですが、その場合は内部エンコーディングを使用するため
内部エンコーディングと文字エンコーディングが異なっている場合違った結果が返ってくる場合があるよって事です。
だから、第二引数を指定してあげた方が安全で安心ですよって事です。
var_dump(mb_strlen($i,○));
※○の部分( 第二引数)。
※エンコード指定の際にスペルミス等不明なエンコード指定した場合、エラーになります。
補足:今回私の環境で行った際にはこちらの記事通りの結果が返ってきました。
他記事を見ていると、記事の中には日本語1文字=2バイトといった結果が返ってきている場合もあるようです。
まとめ
バイト・ビットについて学習をして、実際に関数を用いて実証する事で理解が深まりました。