💨

漢字は2バイトとは限らない?実は“4バイト漢字”や“超重量級絵文字”も存在する

に公開

漢字=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対応を行う開発現場では、注意して設計・実装しましょう。

GitHubで編集を提案

Discussion