文字コードをやさしく図解 — ASCII・Unicode・UTF-8・文字化けの仕組み

公開: 2026年7月 カテゴリ: 基礎理論

「UTF-8とShift_JISって何が違うの?」「なぜ文字化けするの?」——コンピュータは0と1しか扱えないので、文字は必ず番号(数値)に変換して記憶されています。この記事では、文字コードの基本から、ASCII・Unicode・UTF-8の関係、そして文字化けが起きる仕組みまでを図解します。

文字コードとは — 文字に番号をふる取り決め

コンピュータの中身は0と1だけ。だから文字も、「A=65」「B=66」のように1文字ずつ番号を割り当て、その番号(2進数)として記憶・通信します。この「文字↔番号」の対応表が文字コードです。同じ文字でも、どの対応表を使うかで番号もバイト数も変わります。だから「どの文字コードで書いたか」を送り手と受け手でそろえる必要があります。

文字は「番号」を経て「ビットの並び」になる A コードポイント 65(10進) 01000001 1バイト(8ビット)
図1: 文字A → 番号65 → 2進数01000001。この番号の決め方が文字コード

ASCII — 英数字を7ビットで表す原点

ASCII(アスキー)は、アルファベット・数字・記号・制御文字を7ビット(0〜127の128種類)で表す、最も基本的な文字コードです。A=65a=970(文字のゼロ)=48、空白=32 など。英語圏はこれで足りましたが、128種類では日本語(ひらがな・カタカナ・漢字)は到底表せません。そこで各国が独自の拡張を作りました。

日本語の文字コード — Shift_JIS・EUC-JP

日本語は文字数が多いため、1文字を2バイトで表す方式が作られました。代表がShift_JIS(Windowsで広く使われた)とEUC-JP(UNIX系)です。どちらもASCIIと日本語を混在させますが、方式ごとに番号の割り当てが違うため、Shift_JISで書いた文書をEUC-JPとして読むと文字化けします。さらにShift_JISは、2バイト目にASCIIと同じ値(例:\ や記号)が現れることがあり、プログラムの区切り誤りによる不具合の原因にもなりました。

Unicode と UTF-8 — 世界中の文字を1つの体系に

国ごとにバラバラだと不便なので、世界中の文字に世界共通の番号を1つずつ割り当てようという体系がUnicodeです。この「文字↔番号(コードポイント)」の巨大な一覧がUnicode。ただし、Unicodeは番号を決めただけで、「その番号を実際に何バイトで書くか」は別に決める必要があります。それが符号化方式で、代表がUTF-8です。

役割たとえ
Unicode文字に番号(コードポイント)を割り当てる文字集合「文字の番号表」
UTF-8その番号をバイト列に変換する符号化方式「番号を書き出すルール」

UTF-8は、文字によってバイト数が変わる(可変長)のが特徴です。ASCIIと同じ英数字は1バイトのまま、記号や欧文の一部は2バイト、日本語(ひらがな・漢字)はおおむね3バイトになります。ASCII互換なので英語圏の既存データをそのまま扱え、世界中の文字も表せるため、現在のWebの標準になっています(このページも charset="UTF-8" です)。

UTF-8:文字によってバイト数が変わる(可変長) A 1バイト é 2バイト 3バイト 3バイト 😀 4バイト 英数字は1バイト(ASCII互換)、日本語は3バイト、絵文字などは4バイト
図2: UTF-8は文字ごとにバイト数が異なる。だから「文字数」と「バイト数」は一致しない

文字化けはなぜ起きるのか

文字化けの正体は、「書いたときの文字コード」と「読むときに想定した文字コード」の食い違いです。UTF-8で保存した「あ」(3バイト)を、Shift_JISだと思って読むと、バイトの区切り方も対応表も違うため、まったく別の文字(や記号の羅列)に化けます。対策はシンプルで、保存時・送信時・表示時の文字コードをそろえること。HTMLなら <meta charset="UTF-8">、CSVやメールなら文字コードの指定を合わせます。近年はUTF-8への統一が基本です。

🔢 番号とビットを確かめるなら:文字コードの番号(例:A=65)を 基数変換ツール に入れれば、2進数・16進数での表し方を確認できます。文字数とバイト数の違いは 文字数カウンター で、同じ文字列の「文字数」と「バイト数」を見比べると実感できます。

基本情報技術者試験ではこう出る

「ASCIIは何ビットか(→7ビット)」「UnicodeとUTF-8の関係」「文字化けの原因」「Shift_JIS・EUC-JP・UTF-8の特徴」が定番です。押さえるべきは、Unicode=文字集合(番号表)/UTF-8=符号化方式(バイトにするルール) という役割分担と、UTF-8ではASCIIが1バイト・日本語が3バイトという点。「1文字=1バイトとは限らない」という感覚が大切です。ビット・バイトの基礎は 2進数と基数変換 と合わせて整理すると確実です。

よくある質問

Q. BOM(バイトオーダーマーク)とは?
A. ファイルの先頭に付く、文字コードや並び順を示す目印です。UTF-8では付けても付けなくても読めますが、BOM付きUTF-8だと一部のプログラムが先頭に余計な文字を検出して不具合を起こすことがあります。原則BOMなしUTF-8が無難です。

Q. なぜ日本語のバイト数はUTF-8とShift_JISで違うの?
A. 符号化のルールが違うためです。Shift_JISは日本語をほぼ2バイトで表しますが、UTF-8は世界中の文字を統一的に扱う設計上、日本語はおおむね3バイトになります。ファイルサイズはShift_JISの方が小さくなることもありますが、互換性・国際化の観点でUTF-8が主流です。

Q. 「全角・半角」と文字コードの関係は?
A. 半角英数字はASCII由来で1バイト(UTF-8でも1バイト)、全角文字は日本語用の文字で複数バイトになります。半角カナは歴史的経緯から扱いが不安定で文字化けしやすいため、データ交換では避けるのが無難です。

まとめ

文字コードは「文字↔番号」の取り決め。ASCII=英数字を7ビット、Unicode=世界共通の番号表、UTF-8=その番号をバイトにする可変長の方式(ASCII互換)。文字化けは書きと読みの文字コードの食い違いで起きるので、UTF-8にそろえるのが基本です。「1文字=1バイトではない」を押さえておきましょう。

関連ページ: 2進数と基数変換基数変換ツール文字数カウンター記事一覧