文字列のバイト数カウント(エンコーディング別)

入力した文字列がUTF-8・Shift_JIS・EUC-JP・UTF-16・JIS(ISO-2022-JP)でそれぞれ何バイトになるかを計測します。データベースの文字数制限やフォームの入力上限を確認する際に便利です。

Tips

  • UTF-8では半角英数字は1バイト、ひらがな・カタカナ・漢字などの日本語は多くの場合3バイトになるため、同じ文字数でも英語と日本語ではバイト数が大きく異なります。
  • データベースの列がVARCHAR(255)のようにバイト数ベースで文字数制限を設けている古いシステムの場合、日本語を含む文章は英語の文章よりずっと早く上限に達してしまいます。
  • 絵文字の多くはサロゲートペアという2つのコード単位で表現され、UTF-8で4バイト・UTF-16でも4バイトになるため、SNSの文字数カウントで思ったより早く上限に達する原因になります。
  • すでにバイト数の数値が分かっていて、それをKB・MBなど他の単位に変換したい場合は、姉妹ツールの「バイト単位変換」をご利用ください。このツールは文字列からバイト数を求める逆方向の計算を担当します。

よくある質問

文字数は「見た目の文字がいくつあるか」を数えるのに対し、バイト数は「その文字列をコンピューター上のデータとして保存・送信する際に何バイト(何オクテット)必要か」を表します。ASCII文字は1文字1バイトで一致しますが、日本語などの多バイト文字を含む文章では文字数とバイト数が大きくずれます。

UTF-8は文字ごとに1〜4バイトの可変長で符号化する仕組みで、日本語の大半(ひらがな・カタカナ・常用漢字)は3バイトになります。一方Shift_JISは日本語の大半を2バイトで符号化するため、同じ日本語の文章でもUTF-8のほうがバイト数が大きくなるのが一般的です。

データベースの種類・列の文字コード設定によって異なります。MySQLのVARCHAR(n)は基本的に「n文字」で制限されますが、内部的にはバイト数の上限(インデックスに使えるキー長など)も別途存在するため、絵文字を含む文章でエラーになるケースがあります。実際の挙動は使用しているDBMSのドキュメントで確認してください。

半角英数字・記号はUTF-8・Shift_JIS・EUC-JPのいずれでも1バイトで表現されますが、全角文字(ひらがな・カタカナ・漢字・全角記号)はエンコーディングに応じて2〜3バイトになります。同じ「10文字」の文章でも、半角のみなら10バイト、全角のみなら20〜30バイトと大きな差が生まれます。

このツールは文字列を入力すると、その文字列のバイト数をエンコーディングごとに計算します。一方「バイト単位変換」ツールは、すでに分かっているバイト数(例: 1,500,000バイト)をKB・MB・GBなどの単位に変換するツールです。「文字列→バイト数」を求めたいときは本ツール、「バイト数→他の単位」を求めたいときはバイト単位変換ツールをお使いください。
ツールくん

余談ですが ― SNSの文字数制限とバイト数の知られざる関係

古いバージョンのMySQLで使われていた「utf8」文字セットは、実はUnicodeの絵文字(U+10000以降の補助文字面)を保存できない仕様でした。UTF-8は本来4バイトまでの可変長エンコーディングですが、MySQLの「utf8」は歴史的経緯から最大3バイトまでしか扱えず、絵文字を含む文章をINSERTしようとするとエラーになる不具合が長年報告されていました。現在は4バイトまで正しく扱える「utf8mb4」への移行が推奨されており、文字コードとバイト数の仕様を正確に理解しておくことの重要性を示す代表例になっています。

かつてTwitter(現X)が140文字制限を採用していた時代、日本語ユーザーは140文字でも十分に長い文章を書けるのに対し、英語ユーザーは140文字では単語数にして20〜30語程度しか書けず不公平だという議論がありました。これは英語がアルファベット1文字=1文字なのに対し、日本語は漢字1文字に多くの情報量が詰まっているためです。後にTwitterは日本語などの言語を「1文字=1カウント」、英語などを一部「2バイト=1カウント」で計算する独自の重み付け方式を導入し、言語間の公平性を調整しました。

携帯電話のSMSにも同様の事情があります。GSM方式のSMSは1通あたり通常160文字までですが、絵文字や日本語など7ビットGSM文字セットに含まれない文字を1つでも含むと、エンコード方式がUCS-2(UTF-16相当)に切り替わり上限が70文字まで一気に減少します。「日本語を1文字使っただけで送信可能な文字数が半分以下になる」という現象は、まさにこの記事のテーマである文字コードとバイト数の関係が引き起こす典型例です。