漢字=2バイトの常識、実は例外も?
多くのプログラマーが「漢字は2バイト」と教えられてきました。
実際、Shift_JISなどでは多くの漢字が2バイトで表現されています。
しかし、UTF-8が主流の現在では、3バイトや4バイトを使う漢字も存在します。
UTF-8での漢字バイト数の違い
UTF-8は文字の種類によって1〜4バイトで表現されます。たとえば:
-
日
→ 3バイト(E6 97 A5
) -
𠮷
(よく使われる「吉」の異体字)→ 4バイト(F0 A0 AE B7
)
この「𠮷(U+20BB7)」は、サロゲートペアとして扱われる補助漢字(サプリメンタリープレーン)の1つです。
3バイト以上の漢字の例
文字 | Unicode | UTF-8表現 | 備考 |
---|---|---|---|
𠮷 | U+20BB7 | F0 A0 AE B7 | 異体字「吉」など |
𡈽 | U+2123D | F0 A1 88 BD | 「埼玉県」の「埼」の異体字 |
𩸽 | U+29E3D | F0 A9 B8 BD | 魚へんの難読漢字など |
実は絵文字はさらに“重い”ことも
最近では、漢字以上に注意が必要な存在が「絵文字」です。
一見1文字に見える絵文字でも、複数のUnicodeコードポイントを組み合わせてできているものがあります。
例:家族の絵文字 👨👩👧👦
-
構成:
👨
(U+1F468)
+ ZWJ(ゼロ幅接合子)
+👩
(U+1F469)
+ ZWJ
+👧
(U+1F467)
+ ZWJ
+👦
(U+1F466) -
合計:7コードポイント
-
UTF-8としても20バイト以上
このように、見た目は1文字でも内部的には7文字分に相当するケースがあります。
iOS17.4から「家族構成」絵文字が非常にシンプルなアイコンで置き換えられたことが今になって話題になっています。
多様性の影響でしょうか?
なぜ気にするべきか?
-
文字数カウントと実際のバイト長が一致しない
UIの「最大10文字」入力制限が、見た目5文字で超過してしまう可能性も。 -
DB保存時に文字化けや切断が発生
utf8mb4
でなければ保存できない絵文字や補助漢字があります。 -
SNS・チャットアプリ・フォーム入力の実装に影響
文字数制限、正規表現、文字列処理において不具合を引き起こしやすいです。
まとめ
- 「漢字は2バイト」は過去の話。UTF-8では4バイト漢字も存在します。
- 「絵文字は1文字」は見た目だけ。内部的には7文字相当以上の絵文字もあります。
- 正しい文字処理には、**「表示上の文字数」「Unicodeコードポイント数」「バイト数」**を分けて考える必要があります。
🔍 文字の重さ(バイト数やコードポイント)は、文字列制限や文字処理の落とし穴になりやすいポイントです。
特にグローバル対応やSNS対応を行う開発現場では、注意して設計・実装しましょう。