文字数とバイト数の違い|Shift_JIS・UTF-8・固定長
2026.10.03 更新 · 4分で読めます
同じ文章でも、UTF-8、UTF-16、Shift_JIS(CP932)、EUC-KR(CP949)ではバイト数が変わります。日本語・半角カナ・絵文字のバイト数と、DBのVARCHARや固定長ファイル・帳票で長さを合わせる方法をまとめました。
文字数・バイト数カウントをすぐに使う文字数とバイト数は別の単位です。こんにちは ZEKILOは12文字ですが、UTF-8では22バイト、Shift_JISでは17バイトになります。DBのカラム長や固定長ファイル、帳票の桁数のようにバイトで長さを決めている場面では、相手のシステムが使う文字コードで数える必要があります。文字数・バイト数カウントに文章を入れると、文字数、UTF-16の長さ、UTF-8・Shift_JIS・EUC-KRのバイト数をまとめて確認できます。
1文字は何バイトか
次の表の数字は、すべてバイト数です。
| 文字 | UTF-8 | UTF-16 | Shift_JIS(CP932) | EUC-KR(CP949) |
|---|---|---|---|---|
A 英数字 |
1 | 2 | 1 | 1 |
あ ひらがな |
3 | 2 | 2 | 2 |
漢 漢字 |
3 | 2 | 2 | 2 |
ア 半角カナ |
3 | 2 | 1 | 表現できない |
가 ハングル |
3 | 2 | 表現できない | 2 |
😀 絵文字 |
4 | 4 | 表現できない | 表現できない |
- UTF-8は、コードポイントの範囲に応じて1〜4バイトを使います(RFC 3629)。U+007Fまでが1バイト、U+07FFまでが2バイト、U+FFFFまでが3バイト、それより上が4バイトです。かなとよく使う漢字は3バイトで、半角カナも3バイトです。
- UTF-16は2バイト単位です。U+FFFFを超える文字は2単位(4バイト)を使います。JavaScriptの
lengthやJavaのString.length()が返すのは、バイト数ではなくこの単位の数です。 - Shift_JISは、ASCIIと半角カナを1バイト、かな・漢字を2バイトで表します。半角が1バイト、全角が2バイトなので、帳票や固定長の設計ではバイト数をそのまま桁数として数えられます。UTF-8ではこの対応が成り立ちません。
EUC-KRはCP949(MS949)、Shift_JISはCP932(Windows-31J)を基準にしています。システムによって異なる場合があります。WHATWG Encoding標準では、shift_jisのラベルにwindows-31jやms932が含まれます。
例で見る違い
| 入力 | 文字数 | UTF-16の長さ | UTF-8 | Shift_JIS(CP932) | EUC-KR(CP949) |
|---|---|---|---|---|---|
こんにちは ZEKILO |
12 | 12 | 22 | 17 | 17 |
①髙 |
2 | 2 | 6 | 4 | — |
👍🏻가 |
2 | 5 | 11 | — | — |
안녕하세요 ZEKILO |
12 | 12 | 22 | ハングル5文字が表現できない | 17 |
똠방각하 |
4 | 4 | 12 | — | 8 |
「—」は、その文字コードで表現できない文字が含まれていることを表します。
①と髙はJIS X 0208にはなく、CP932の拡張文字です。CP932では2バイトずつで表せますが、JIS X 0208の範囲だけを扱うシステムでは文字化けすることがあります。👍🏻가の親指の絵文字は、2つのコードポイント(絵文字と肌の色)でできていますが、画面では1文字に見えます。人が見る文字の単位(書記素クラスター、UAX #29)では2文字、コードポイントでは3つ、UTF-16の長さは5です。何を数えるかによって答えが変わります。똠はKS X 1001のハングル2,350字に含まれず、CP949の拡張領域にある文字です。
DBのVARCHAR:nは文字数かバイト数か
VARCHAR(10)の10が何を数えるかは、製品によって違います(2026年10月時点の各製品のドキュメントによる)。
| 製品 | nの単位 |
|---|---|
MySQL VARCHAR(n) |
文字数 |
PostgreSQL varchar(n) |
文字数 |
Oracle VARCHAR2(n) |
BYTEかCHARで指定。省略するとNLS_LENGTH_SEMANTICS(既定値はBYTE)に従う |
SQL Server varchar(n) |
バイト数 |
バイト数で決まるカラムでは、文字コードがそのまま上限になります。山田太郎はShift_JISで8バイト、UTF-8で12バイトです。バイト基準で10のカラムには、Shift_JISなら入りますが、UTF-8では入りません。Shift_JISのデータベースをUTF-8に移行すると桁あふれのエラーが出るのは、かなや漢字が2バイトから3バイトに増えるためです。移行の前に、最も長い値のバイト数を新しい文字コードで数えておいてください。
文字数で数えるMySQLにも、行全体で65,535バイトという上限があります。実際に宣言できる最大長は文字セットによって変わります。
固定長ファイルと帳票で気をつけること
固定長ファイルでは項目ごとにバイト数が決まっていて、余った部分をスペースやゼロで埋めます。1つの項目が1バイトずれると、後ろの項目がすべてずれます。
- 埋める数はバイトで計算します。10バイトの氏名項目に
山田太郎を入れる場合、Shift_JISでは8バイトなのでスペースを2つ足します。文字数(4)から計算して6つ足すと、14バイトになってしまいます。 - 半角カナの濁点・半濁点は、独立した1バイトの文字です。
ヤマダ タロウはShift_JISで8バイトですが、UTF-8では22バイトになります。全角のヤマダ タロウは、Shift_JISで13バイト、UTF-8で19バイトです。 - 切り詰めるときは、文字の境界で切ります。2バイト文字の1バイト目だけが残ると、その文字と後ろの内容が文字化けします。1文字ずつ足していき、上限を超える手前で止めます。
- 改行は、CRLFなら2バイト、LFなら1バイトです。
- 相手のシステムで表現できない文字は、先に取り除きます。絵文字や、CP932にない文字が該当します。文字数・バイト数カウントは、Shift_JISやEUC-KRで表現できない文字がいくつあるかを警告で表示します。
まとめ
- 長さの制限を見たら、単位が文字数かバイト数か、バイト数ならどの文字コードかを最初に確認します。
- かなとよく使う漢字は、UTF-8で3バイト、Shift_JISで2バイトです。半角カナは、Shift_JISで1バイト、UTF-8で3バイトです。
😀のような絵文字はUTF-8で4バイトで、Shift_JISやEUC-KRでは表現できません。lengthが返すのはUTF-16の長さで、文字数ともバイト数とも異なることがあります。- 送る前に文字数・バイト数カウントで実際のバイト数を確認してください。入力はブラウザ内だけで処理されます。
この記事に関連するツール
出典と基準
- WHATWG Encoding Standard
- RFC 3629 — UTF-8, a transformation format of ISO 10646
- Unicode UAX #29 — Unicode Text Segmentation
- MySQL 8.4 Reference Manual — The CHAR and VARCHAR Types
- PostgreSQL Documentation — Character Types
- Oracle Database 19c SQL Language Reference — Data Types
- Oracle Database 19c Reference — NLS_LENGTH_SEMANTICS
- Microsoft Learn — char and varchar (Transact-SQL)