文字コードとは? 文字化けが起きる理由とUTF-8

約13分 · 更新: 2026年10月23日

文字コードは、文字ごとに番号を決めた「対応表」と、その番号をバイトの並びとして保存する決まりです。文字化けは、ある表で保存したバイトを、別の表で読んだときに起きます。今は世界共通の表Unicodeと、その保存のしかたUTF-8が標準です。2026年の調査(W3Techs)では、Webサイトの約99%がUTF-8です。

この記事でわかること

  • コンピュータが文字を番号として記憶するしくみ(ASCII・Shift_JIS・Unicode)
  • UnicodeとUTF-8の違いと、1文字が何バイトになるか
  • 文字化けが起きる理由と、実際に化けた文字の例
  • CSVやメールでの文字化けの防ぎ方、絵文字や機種依存文字の話

前提知識: 特にありません。「ビット」と「バイト」(8ビットで0〜255の256通り)を知っていると読みやすくなります。

身近なところでは

会社のシステムからダウンロードしたCSVファイルをExcelで開いたら、「縺薙s縺ォ縺。縺ッ」のような見慣れない漢字が並んでいた。メールの件名が「=?UTF-8?B?5Lya6K2w?=」のような記号の列になっていた。こうした「文字化け」に出会ったことがある人は多いでしょう。

実は、最初の例は「こんにちは」、2つめの例は「会議」です。どちらもデータは無事で、読み方を間違えているだけです。この記事では、コンピュータが文字をどう記憶しているかから始めて、文字化けが起きる理由と防ぎ方までを順に見ていきます。

文字は番号で記憶されている

コンピュータが記憶できるのは、0と1の並び、つまり数だけです。そこで、文字1つずつに番号を決め、その番号を記憶します。画面に出すときは、番号から文字の形を探して描きます。数を0と1で表すしくみは、「コンピュータは0と1でどう計算するの?」で説明しています。

「どの文字を何番にするか」と「その番号をどんなバイトの並びで保存するか」の決まりをまとめて、文字コードと呼びます。大事なのは、番号の決め方は1つではないことです。書く人と読む人が同じ決まりを使って、はじめて同じ文字が見えます。

最初の共通の表: ASCII

1963年より前は、コンピュータのメーカーごとに文字の番号がばらばらで、表し方は60通りを超えていました。これでは、別のメーカーの機械とデータをやりとりできません。そこでアメリカの規格団体が1963年に定めた共通の表が、ASCII(アスキー)です。

ASCIIは7ビットの表で、番号は0〜127の128通りです。英字・数字・記号と、改行などの「制御」に使う番号が入っています。たとえば英字の「A」は65番です。ただ、128通りでは日本語の文字はとても入りません。

日本語の表が何種類もあった理由

漢字は数千字あるので、1バイト(256通り)では足りません。そこで日本の国の規格(JIS)は1978年、漢字6,349字を含む6,802字の表を定めました。今のJIS X 0208のもとになった表で、1文字を2バイトで表します。

問題は、この2バイトの文字を、英数字の1バイトの文字とどう混ぜて並べるかでした。使う場面ごとに事情が違ったため、主に3つのやり方が広まりました。

  • Shift_JIS: 日本のパソコンで使われていた半角カタカナ(1バイトで表す細いカタカナ)の番号を変えずに、漢字を足したやり方です。Windowsの日本語版も、これを広げた表を使ってきました。
  • EUC-JP: 業務用のコンピュータのOSであるUNIX向けに、UNIXの業界団体が標準化したやり方です。
  • ISO-2022-JP: 電子メール用です。当時のメールは7ビットの文字しか通せない前提だったため、特別な記号で英数字と日本語を切り替えます。日本では「JISコード」と呼ばれることもあります。

3つとも、もとの漢字の表は同じJISの表です。それでも、同じ「あ」が保存されるバイトは、Shift_JISでは82 A0、EUC-JPではA4 A2と違います。どのやり方で保存したかがわからないと、正しく読めません。

世界中の文字を1つの表に: Unicode

国や地域ごとに表が違うと、日本語と中国語とロシア語を1つの文書に混ぜることもできません。そこで、世界中の文字に重ならない番号をつける1つの表が作られました。これがUnicode(ユニコード)です。

Unicodeでの文字の番号を、コードポイントと呼びます。「U+」に続けて16進数で書く決まりで、「あ」はU+3042です。16進数は、0〜9とA〜Fの16種類の記号で数を書く方法で、1バイトの0〜255をちょうど2桁で書けます。U+3042を10進数に直すと12354です。

Unicodeの番号は、U+0000からU+10FFFFまでの1,114,112通りあります。2025年9月のUnicode 17.0には159,801字が入り、2026年9月の18.0で17万字を超えました。漢字やひらがなだけでなく、記号や絵文字も同じ表に入っています。

番号をバイトにする: UTF-8

Unicodeが決めるのは、文字と番号の対応までです。その番号をどんなバイトの並びで保存するかは、別の決まりで決めます。いちばん広く使われているのが、UTF-8です。

UTF-8は、番号の大きさに応じて、1文字を1〜4バイトで表します。ASCIIと同じ範囲の英数字は、ASCIIと同じ1バイトのままです。このため、英数字だけのASCIIのファイルは、そのまま正しいUTF-8として読めます。日本語の文字の多くは3バイトで、「あ」はE3 81 82になります。絵文字の多くは4バイトです。

文字から番号、番号からUTF-8のバイトへ 文字 番号 UTF-8で保存 A U+0041 41 あ U+3042 E3 81 82 😀 U+1F600 F0 9F 98 80 1文字は1〜4バイト
Unicodeの表で文字を番号にし、UTF-8の決まりでその番号をバイトにします。バイトは16進数で書いています(41は10進数の65)。省略していること: 番号からバイトを作る計算の手順。

UTF-8のほかに、UTF-16という保存のしかたもあります。多くの文字を2バイト、絵文字などを4バイトで表し、主にプログラムの内部で文字を扱うときに使われます。UTF-8とUTF-16は、同じUnicodeの番号を、違うバイトの並びにするだけです。

ファイルの先頭の目印: BOM

ファイルの先頭に、「このファイルはUnicodeで書いてあります」と示す数バイトの目印をつけることがあります。これをBOM(バイト順マーク)と呼びます。UTF-8ではEF BB BFの3バイトです。

UTF-16では、2バイトのどちらを先に書くかで2通りの並べ方があります。「あ」なら30 42とも42 30とも書けるので、BOMで並べ方を示します。一方、UTF-8には並べ方の違いがありません。そのためUnicodeの規格は、UTF-8にBOMをつけることを求めていません。UTF-8のBOMは、「UTF-8で書いてある」と示す目印の役目だけです。

ただ、BOMを手がかりにUTF-8だと見分けるソフトもあります。代表がExcelです。逆に、BOMを想定していないプログラムでは、先頭に見えない文字や「」のようなゴミが入ったように見えることがあります。BOMをつけるかどうかは、読む側に合わせて決めます。

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

ファイルの中にあるのは、バイトの並びだけです。どの文字コードで書いたかは、ふつうはファイルの中に書かれていません。読む側のソフトは、設定や推測で表を選んで読みます。その選択を間違えると、文字化けが起きます。

下の図は、「日本」をUTF-8で保存した6バイトです。UTF-8の表で読めば、3バイトずつ区切って「日本」です。同じ6バイトをShift_JISの表で読むと、2バイト・1バイト・2バイト・1バイトと区切られ、まったく別の4文字になります。ここではWindowsが使うShift_JIS(CP932)で読みました。標準のShift_JISで読んでも同じ結果です。

同じ6バイトを、UTF-8とShift_JISの表で読んだ結果 「日本」をUTF-8で保存した6バイト E6 97 A5 E6 9C AC UTF-8の表で読む 日 本 Shift_JISの表で読む 譌 ・ 譛 ャ 区切り方も、指す文字も変わる
バイトの並びは同じで、読むときの表だけが違います(Shift_JISはWindowsのCP932で計算)。「・」と「ャ」は、1バイトで表す半角の文字です。省略していること: Shift_JISで1バイトか2バイトかを見分ける規則の細かい部分。

「文字化け」という言葉そのものでも試せます。UTF-8で保存した「文字化け」の12バイトをShift_JISの表で読むと、「譁�蟄怜喧縺�」と表示されます。「�」は置換文字と呼ばれる記号です。表のどの文字にも当てはまらないバイトの代わりに表示されます。この例では、2か所のバイトが当てはまらず「�」になりました。ソフトによっては「・」や「?」になり、化け方も少し変わります。

UTF-8のひらがなはE3 81かE3 82で、カタカナはE3 82かE3 83で始まります。これらをShift_JISの表で読むと、それぞれ「縺」「繧」「繝」になります。化けた文字に「縺」「繧」「繝」が多ければ、UTF-8のファイルをShift_JISで読んでいる、と見当がつきます。逆に、Shift_JISのファイルをUTF-8で読むと、「�」がずらりと並びがちです。

よくある場面と、防ぎ方

CSVファイルをExcelで開く

CSVは、表のデータをコンマで区切って書いた、文字だけのファイルです。BOMのないUTF-8のCSVをダブルクリックで開くと、Excelが正しく読めないことがあります。Microsoftの説明でも、ふつうに開けるのはBOMつきで保存したUTF-8のCSVとされています。

直すには、Excelの「データ」タブにある「テキストまたはCSVから」で読み込みます。そのとき、元のファイルの文字コードに「65001: Unicode (UTF-8)」を選びます。CSVを作る側なら、Excelの保存形式「CSV UTF-8(コンマ区切り)」を選ぶと、BOMつきのUTF-8で保存されます。どちらの場合も、元のファイルを上書きする前に確かめるのが安全です。

メールの件名

メールの件名などの見出しの部分には、もともと英数字しか書けませんでした。そこで日本語は「=?UTF-8?B?…?=」の形に変えて書きます。「UTF-8」の部分が文字コード、「B」が置き換え方の種類(Base64)です。後ろの部分は、そのバイトを英数字に置き換えたものです。冒頭の「5Lya6K2w」は、「会議」のUTF-8の6バイトです。メールソフトがこの形を読み解けないと、記号の列のまま表示されます。

防ぐための基本

  • 新しく作るファイルやシステムは、UTF-8にそろえる
  • ファイルを渡すときは、文字コードも伝える(「UTF-8のCSVです」など)
  • Webページでは、HTMLの先頭に「<meta charset="utf-8">」と書いて、UTF-8だと明示する
  • 化けたら上書き保存せず、文字コードを指定して開き直す

絵文字と「豆腐」

絵文字も、Unicodeの表に番号を持つ文字の1つです。たとえば😀はU+1F600で、UTF-8では4バイトです。絵文字は1999年に日本の携帯電話で使われ始めました。当初は携帯電話の会社ごとに番号が違い、別の会社の電話に送ると「〓」に置き換わることもありました。2010年のUnicode 6.0でまとめて表に入り、世界中で同じ番号で送れるようになりました。

新しい絵文字が「□」のような四角で表示されることがあります。これは文字化けとは別の現象です。番号は正しく読めていますが、その端末のフォント(文字の形のデータ)に、その文字の形がないのです。この四角は、見た目から英語で「tofu(豆腐)」と呼ばれます。

「機種依存文字」とは

①や㈱は、昔「機種依存文字」と呼ばれ、使わないように言われてきました。1978年のJISの表にこれらがなく、NECなどのメーカーが、表の空いている番号に独自に追加した文字だったからです。WindowsとMacでは同じ文字を違う番号に置いていました。そのためWindowsの①が、Macでは「(日)」などの別の文字に化けました。

今は①(U+2460)も㈱(U+3231)もUnicodeに入っています。UTF-8でやりとりすれば、ほとんどの環境で正しく表示されます。今も「環境依存文字」と呼んで注意をうながすことがあるのは、この名残です。ただ、古いシステムや、使える文字を昔のJISの表に限っているシステムでは、今もうまく扱えないことがあります。

よくある誤解

誤解: 1文字は1バイト、日本語(全角)は2バイト

実際は、文字コードによって違います。ASCIIの英数字は1バイト、Shift_JISの日本語は2バイトでした。しかしUTF-8では、日本語の多くが3バイト、絵文字は4バイトです。同じ「文字化け」の4文字でも、Shift_JISでは8バイト、UTF-8では12バイトになります。「全角は2バイト」は、Shift_JISの時代の感覚から生まれた言い方です。

誤解: 文字化けしたファイルは壊れている

実際は、ほとんどの場合、ファイルのバイトは無事です。読むときの表を間違えているだけなので、正しい文字コードを指定して開き直せば元に戻ります。ただし、化けた状態で上書き保存すると、「�」に置き換わったバイトは失われ、本当に戻せなくなります。化けたら、まず保存しないことが大切です。

誤解: UnicodeとUTF-8は同じもの

実際は、役割が違います。Unicodeは「どの文字を何番にするか」を決める表です。UTF-8やUTF-16は、「その番号をどんなバイトで保存するか」の決まりです。同じ「あ」(U+3042)でも、UTF-8ではE3 81 82、UTF-16では30 42と、保存されるバイトは違います。ソフトの設定で「Unicode」とだけ書かれていると、どちらの意味か迷いやすいのが混同のもとです。

数字で見る

文字Unicodeの番号UTF-8UTF-16Shift_JIS
AU+00411バイト2バイト1バイト
あU+30423バイト2バイト2バイト
文U+65873バイト2バイト2バイト
😀U+1F6004バイト4バイト表にない

ASCIIの表は128通り、Unicodeの番号の範囲は1,114,112通りで、約8,700倍です。Webでは、文字コードがわかるサイトのうち、UTF-8を使う割合が2026年8月の調査で99.0%でした(W3Techs)。2023年4月の調査でも97.9%で、ほぼUTF-8にそろったと言えます。一方、社内の古いシステムや、そこから出力したCSVには、今もShift_JISが残っています。

もっと詳しく学ぶ

次に読む

シリーズ「コンピュータのしくみ」の記事

  1. コンピュータは0と1でどう計算するの? 2進数と足し算の回路
  2. CPUとは? パソコンやスマホの中で何をしているのか
  3. なぜAIにGPUが使われるの? 大量の掛け算を同時にこなすしくみ
  4. OSとは? パソコンやスマホで何をしているソフトなのか
  5. キャッシュメモリとは? CPUがメモリを待たずに済むしくみ
  6. NPUとは? スマホやPCのAI専用回路のしくみ
  7. FPGAとは? あとから回路を書き換えられるチップのしくみ
  8. 文字コードとは? 文字化けが起きる理由とUTF-8
  9. ASICとは? 特定用途向けのチップとCPU・FPGAとの違い
  10. コンパイラとは? プログラムが機械語になるまで
  11. 論理ゲートとは? AND・OR・NOTで計算できるしくみ
  12. RISC-Vとは? 誰でも使える命令セットのしくみ
  13. アルゴリズムとは? 手順の工夫で計算が速くなるしくみ
  14. データベースとは? 表・SQL・インデックスのしくみ
  15. Gitとは? バージョン管理のしくみとGitHubとの違い

この分野の問題: Web技術の基礎

参考にした資料

やさしい解説の一覧へ