UTF-8バイト数計算ツール
入力
| テキスト | Héllo |
|---|
UTF-8バイト数計算ツール
任意のテキストを入力すると、UTF-8でのバイト数、UTF-16でのバイト数、文字数(コードポイント数)がわかります。ASCII文字はUTF-8で1文字あたり1バイト、アクセント付きラテン文字は2バイト、漢字など多くの文字は3バイト、絵文字は4バイトを占めます。そのため、文字列のバイト数は見た目の文字数より大きくなることがあります。
入力
テキスト
結果
値を入力すると計算結果が表示されます。
サイズ
UTF-8バイト数
文字列と、それが占めるバイト数は同じものではありません。画面上では単語は文字の並びですが、保存や通信の場ではバイトの並びであり、その二つの数が一致することはまれです。この計算ツールはテキストを受け取り、三つの数を返します。含まれる文字(Unicodeコードポイント)の数、UTF-8として占めるバイト数、UTF-16として占めるバイト数です。データベースの列の設計、APIやメッセージ長の上限の確認、短く見える文字列が思いのほか大きくなる理由の理解などに役立ちます。
文字とバイト
文字は書記の単位です。文字、数字、表意文字、絵文字などがそれにあたります。Unicodeはそれぞれに「コードポイント」と呼ばれる番号を割り当て、U+00E9 のように表記します。バイトは保存の単位で、8ビットです。エンコーディングはコードポイントをバイトに変換する規則であり、エンコーディングが異なれば同じテキストでもバイト数は変わります。
英数字だけのテキストではこの違いに気づきにくいものです。一般的なエンコーディングでは、ASCII文字がたまたまきりのよいバイト数になるためです。差が現れるのは、テキストにアクセント付き文字や日本語などの非ラテン文字、絵文字が含まれた瞬間です。
UTF-8における1文字のバイト数
UTF-8は可変長のエンコーディングで、1文字はコードポイントに応じて1〜4バイトを占めます。
U+0000〜U+007F(ASCII:アクセントなしのラテン文字、数字、一般的な記号):1バイトU+0080〜U+07FF(ラテン文字のアクセント、ギリシャ文字、キリル文字、ヘブライ文字、アラビア文字):2バイトU+0800〜U+FFFF(ひらがな・カタカナ・漢字など多くの文字):3バイトU+10000以上(絵文字や稀な文字):4バイト
ASCII文字が1バイトのままであるため、UTF-8はASCIIと後方互換性があります。これが、UTF-8がWebやテキストファイルの標準エンコーディングになった大きな理由です。
UTF-16における1文字のバイト数
UTF-16はほとんどの文字を1つの16ビット符号単位、すなわち2バイトで保存します。U+FFFF を超える文字(絵文字やその他の稀な記号)は、2つの符号単位からなるサロゲートペアとして保存され、4バイトを占めます。1バイトのケースは存在せず、ふつうのASCII文字でもUTF-16では2バイトかかります。これはJava、C#、JavaScriptなどの言語が用いるメモリ内の文字列形式です。
計算例
テキスト Héllo を考えます。
文字数は5ですが、UTF-8では6バイトになります。é が2バイトの範囲に入るためです。UTF-16では5文字それぞれが2バイトの符号単位となり、合計10バイトになります。
次に、絵文字1つ 😀(U+1F600)を考えます。これは1文字ですが、U+FFFF を超えています。UTF-8では4バイトで符号化され、UTF-16でもサロゲートペアとして4バイトで保存されますが、文字数はわずか1です。
バイト数が重要になる理由
実際のシステムの上限は、文字数ではなくバイト数で数えられることがほとんどです。VARCHAR(255) と宣言した列は、データベースエンジンや文字セットによってバイト単位か文字単位かが変わります。メッセージ長の制限、APIのペイロードのフィールド、HTTPヘッダーのサイズ、フォームの検証なども、しばしばバイト単位で表されます。UTF-8のバイト数を前もって測っておけば、値が収まるかどうかや、消費する容量・帯域を把握できます。文字数だけでは分からないことです。
関連する計算ツール
文字列の実際のバイト値を2進数・16進数・10進数のコードとして見るには、テキスト → 2進数 / 16進数 / ASCII 変換 を使います。テキストを転送のためにBase64で包んだあとのサイズを測るには、Base64エンコードのオーバーヘッド を参照してください。占める容量ではなく、文字列が運ぶ情報量を見積もるには、シャノンエントロピーの計算 がそのエントロピーを計算します。
よくある質問 (FAQ)
バイト数が文字数より大きくなるのはなぜですか。
文字は目に見えるもの、バイトは保存される単位です。UTF-8では、基本的なASCII文字(アクセントなしのラテン文字、数字、一般的な記号)だけが1バイトに収まります。é のようなアクセント付き文字は2バイト、漢字などの多くの文字は3バイト、絵文字は4バイトを使います。そのため、ASCII以外の文字を含むテキストは文字数よりも多くのバイトを占めます。
UTF-16ではASCIIテキストでも各文字が最低2バイトを使うため、差はさらに大きくなります。
UTF-8とUTF-16の違いは何ですか。
どちらもUnicode文字をバイトに変換する方式です。UTF-8は1文字あたり1〜4バイトの可変長で、ASCIIと後方互換性があるため、Webやファイルで主流の符号化方式となっています。UTF-16はほとんどの文字を2バイトで、基本多言語面(BMP)を超える稀な文字(絵文字など)を4バイトで表します。Java、C#、JavaScriptなどの言語のメモリ内文字列表現として一般的です。
ラテン文字中心のテキストではUTF-8の方が小さく、東アジアの文字が中心のテキストでは両者は同程度になることが多いです。
1文字は何バイトを占めますか。
UTF-8ではコードポイントによって異なります。U+0000〜U+007F(ASCII)は1バイト、U+0080〜U+07FF(ラテン文字のアクセント、ギリシャ文字、キリル文字、ヘブライ文字、アラビア文字)は2バイト、U+0800〜U+FFFF(多くのCJK文字など)は3バイト、U+10000以上(絵文字、稀な文字)は4バイトです。
UTF-16では、同じ文字がU+FFFFまでは2バイト、それを超えるとサロゲートペアとして4バイトを占めます。
バイト数が重要になるのはどんなときですか。
保存や通信は文字数ではなくバイト数で測られます。VARCHAR(255)と宣言したデータベースの列は、エンジンや文字セットによってバイト単位か文字単位かが変わります。APIのフィールド、メッセージ長の上限、フォームの入力制限なども、バイト単位で指定されることが多くあります。UTF-8のバイト数を把握しておくと、値が収まるかどうかや、消費する容量・帯域を見積もるのに役立ちます。