デザインについての学習メモブログ

文字化けの原因と直し方|文字コードの仕組みから復元・解読まで解説

記事内に広告が含まれています。

文字化けの原因と直し方|文字コードの仕組みから復元・解読まで解説

メールやWebページ、ダウンロードしたCSVファイルを開いたら、「縺薙s縺ォ縺。縺ッ」のような意味の分からない文字が並んでいて困ったことはありませんか。

このような文字化けは、壊れているように見えても、多くの場合は正しい文字コードで読み直すだけで元に戻せます。

この記事では、文字化けが起きる仕組みと文字コードの基本、化け方の見た目から原因を見分ける早見表、ブラウザ・メール・Excel・テキストエディタなど場面別の直し方、復元・解読の考え方、そして作る側の対策までを初心者向けに解説します。

文字化けとは?文字コードと起きる仕組み

まずは、文字化けとは何か、そして原因になる「文字コード」とは何かを押さえましょう。

仕組みが分かると、化けた文字を見ただけで原因の見当がつくようになります。

文字化けとは

文字化けとは、本来の文字とは違う、意味の通らない文字や記号が表示されてしまう現象のことです。

コンピューターは文字を数字の並びとして保存しているため、保存したときと読み込むときで数字と文字の対応のさせ方(文字コード)が食い違うと、別の文字として表示されてしまいます。

たとえば、「こんにちは」という文字をある文字コードで保存し、別の文字コードとして読み込むと、「縺薙s縺ォ縺。縺ッ」のように表示されます。

つまり文字化けの多くは、データそのものが壊れたのではなく「読み方を間違えている」状態なので、正しい読み方を選び直せば元に戻ります。

文字コードとは

文字コードとは、文字とコンピューターの中の数字(バイト)を対応させるためのルールのことです。

コンピューターは数字しか扱えないので、「あ」という文字も、決められたルールで数字の並びに置き換えて保存しています。

バイトは、コンピューターがデータを扱うときの単位で、1バイトは00〜FFの16進数(0〜9とA〜Fの16種類の記号で表す数の書き方)2桁で表せます。

同じ「あ」でも、文字コードによって置き換えられる数字が違います。

文字コード「あ」を表すバイト(16進数)バイト数
UTF-8E3 81 823バイト
Shift_JIS82 A02バイト
EUC-JPA4 A22バイト
同じ文字でも、文字コードが違えば保存される数字が変わる

このように、どの文字コードで保存したかが分からなければ、数字の並びを正しい文字に戻せません。

文字コードは、文字の「暗号」を解くための鍵のようなものだと考えると分かりやすいでしょう。

UTF-8・Shift_JIS・EUC-JPとUnicodeの関係

日本語の文字化けに関わる文字コードは、主にUTF-8・Shift_JIS・EUC-JPの3つです。

このうちUTF-8は、世界中の文字に番号を割り振った「Unicode(ユニコード)」という文字の一覧を、バイトの並びに置き換える方式の一つです。

Unicodeは、すべての文字に、使う機器やソフト、言語に関係なく固有の番号を付けるための規格です(Unicode Consortium「ユニコードとは何か?」)。

たとえば「あ」にはU+3042という番号が付いていて、UTF-8ではこれをE3 81 82の3バイトで表します(絵文字にも同じように番号があり、知っておきたい!絵文字のUnicode入力方法と一覧表で紹介しています)。

文字コード特徴よく使われる場面
UTF-8Unicodeのすべての文字を1〜4バイトで表す。日本語のひらがな・漢字は多くが3バイトWebページ、今のパソコン・スマホ全般、プログラミング
Shift_JIS日本語用の古い文字コード。日本語の文字を2バイトで表す古いWindowsのソフト、Excelで作ったCSV、古いWebサイト
EUC-JP日本語用の古い文字コード。日本語の文字を2バイトで表す古いUNIX系のサーバーやWebサイト

Webの文字コードのルールを決めているWHATWGのEncoding Standard(英語)では、UTF-8がUnicodeのやり取りに最も適した文字コードとされ、Shift_JISやEUC-JPは古い(レガシーな)文字コードとして扱われています。

今から何かを作るなら、まずUTF-8を選んでおけば間違いありません。

文字化けが起きる仕組み

文字化けは、「Aという文字コードで保存したデータを、Bという文字コードだと思って読む」ことで起きます。

読む側は、バイトの区切り方も、数字と文字の対応も、Bのルールで解釈してしまうためです。

たとえば「メール」をUTF-8で保存するとE3 83 A1 E3 83 BC E3 83 ABの9バイトになり、これをShift_JISとして読むと次のように区切られます。

Shift_JISとしての区切り方E3 83A1E3 83BCE3 83AB
表示される文字繝。繝シ繝ォ
UTF-8の「メール」をShift_JISとして読むと「繝。繝シ繝ォ」になる

Shift_JISのルールでは、2バイトで1文字の漢字と、1バイトで1文字の半角カナが混ざって読まれるため、「繝。繝シ繝ォ」という意味のない並びになります。

このとき、元の9バイトは何も変わっていないので、もう一度UTF-8として読み直せば「メール」に戻ります。

文字化けの見た目でわかる原因の早見表

文字化けは、どの文字コードをどの文字コードとして読んだかによって、化け方に特徴が出ます。

化けた文字の見た目から、元の文字コードを推理してみましょう。

よくある文字化けの早見表

よく見かける文字化けのパターンを、元の文字と原因、直し方の方向とあわせて一覧にしました。

表の「化けた文字の例」は、実際に元の文字を変換して確かめたものです。

化けた文字の例元の文字見分けるポイント原因直し方
縺薙s縺ォ縺。縺ッ
繝。繝シ繝ォ
こんにちは
メール
「縺」「繝」などの見慣れない漢字と、全角英字や半角カナが交互に並ぶUTF-8のデータをShift_JISとして読んだUTF-8で読み直す
�e�X�gテスト「�」(ひし形の中に?)がたくさん並び、英字が少しだけ残るShift_JISのデータをUTF-8として読んだShift_JISで読み直す
・ニ・ケ・ネテスト半角カナと「・」「、」などの記号が並ぶEUC-JPのデータをShift_JISとして読んだEUC-JPで読み直す
テスト
日本語
テスト
日本語
「ã」「æ」などのアクセント付きの英字や記号が並ぶUTF-8のデータを欧米向けの文字コード(Windows-1252など)として読んだUTF-8で読み直す
?????こんにちは など「?」だけが並ぶ文字を表せない文字コードに変換して保存した元のデータからやり直す(戻せない)

英語のソフトや海外のサービスで日本語が化けるときは、4つ目の「ã」「æ」が並ぶパターンが多く、UTF-8で読み直すと戻ります。

迷ったときは、まずUTF-8、次にShift_JISの順で読み直してみると、多くの文字化けは解決します。

「�」と「?」の違い

文字化けで出てくる「�」と「?」は似ていますが、戻せるかどうかが大きく違います。

「�」は、Unicodeで「REPLACEMENT CHARACTER(置換文字)」と呼ばれるU+FFFDの文字で、読み込むときに文字コードのルールに合わないバイトが見つかったことを表示上で知らせる印です(UnicodeのSpecialsのコード表(英語・PDF))。

画面に「�」が出ていても、ファイルの中身はそのまま残っていることが多いので、ファイルを正しい文字コードで開き直せば元に戻ります。

一方「?」は、保存や変換のときに、その文字コードで表せない文字が「?」という文字に置き換えられて保存されたものです。

たとえば、絵文字の入った文章をShift_JISで保存すると、Shift_JISには絵文字がないため、絵文字の部分が「?」になります。

この場合、元の文字の情報はファイルから消えてしまっているので、どの文字コードで読み直しても戻りません。

場面別・文字化けの直し方

ここからは、文字化けがよく起きる場面ごとに、具体的な直し方を紹介します。

どの場面でも、基本は「正しい文字コードを指定して開き直す」ことです。

Webページ(ブラウザ)が文字化けするとき

Webページの文字化けは、多くの場合、ページを作る側の文字コードの指定が抜けていたり、間違っていたりすることが原因です。

ブラウザは、サーバーから届く情報やページの中の指定を手がかりに文字コードを判断するため、その指定がないと推測に頼ることになり、外れると文字化けします。

Firefoxでは、メニューバーの「表示」から「テキストエンコーディングを修復」を選ぶと、ページの内容から文字コードを推測して読み直してくれます(Mozillaサポート)。

ブラウザによっては文字コードを選び直すメニューがないこともあるので、直らないときは、サイトの運営者に文字化けしていることを伝えるのが確実です。

自分が作ったページが文字化けする場合は、後半の「文字化けを防ぐ作る側の対策」を確認してください。

メールが文字化けするとき

メールの文字化けは、送った側のメールソフトが付けた文字コードの情報と、実際の本文の文字コードが食い違っていることが主な原因です。

メールソフトは、メールに付いている文字コードの情報を信じて本文を読むため、その情報が間違っていると、正しく表示できません。

メールソフトによっては、メッセージを表示する文字コード(エンコード)を選び直す機能があるので、早見表を参考にUTF-8やShift_JISを選んでみましょう。

選び直しても直らないときや、件名・添付ファイル名だけが化けているときは、送り主に、別のメールソフトから送り直してもらうか、内容をファイルにして添付してもらうよう頼むのが近道です。

CSVファイルをExcelで開くと文字化けするとき

Webサービスなどからダウンロードした CSV ファイル(データをコンマで区切って並べたテキストファイル)をExcelで開くと文字化けする場合は、Excelの「データの取得」機能で文字コードを指定して読み込みます。

Microsoftサポート「Excel で CSV UTF-8 ファイルを正しく開くには」によると、UTF-8のCSVは、BOM(ファイルの先頭に付ける「UTF-8です」という目印)付きで保存されていれば普通に開けますが、BOMがないとダブルクリックで開いたときに文字化けすることがあるためです。

  1. Excelを起動し、空白のブックを開きます。
  2. 「データ」タブの「データの取得と変換」グループで、「テキストまたは CSV から」をクリックします。
  3. 文字化けしたCSVファイルを選んで、「インポート」をクリックします。
  4. 表示されたプレビューの画面で、ファイルの文字コードを選ぶ欄(英語版のExcelでは「File Origin」)を、UTF-8に変えます。
    プレビューの文字が正しく表示されれば、選んだ文字コードが合っています。
    UTF-8で直らなければ、日本語(Shift_JIS)にあたる文字コードを選んでみましょう。
  5. 「読み込み」をクリックすると、正しい文字でシートに読み込まれます。

手順の詳細は、Microsoftサポート「テキスト ファイル (.txt または .csv) をインポートまたはエクスポートする」でも確認できます。

Power Queryの説明(Microsoft Learn「テキスト/CSV」)にあるとおり、この画面ではUTF-8はBOMで始まる場合にしか自動で判断されないので、文字化けしていたら文字コードを手で選び直すのがポイントです。

テキストエディタ(VS Code)で文字化けするとき

VS Code(Visual Studio Code、Microsoftの無料のコードエディタ)でファイルが文字化けする場合は、「エンコード付きで再度開く」で文字コードを選び直します。

VS Codeは、ファイルを開くときに設定された文字コード(初期設定はUTF-8)で読み込むため、Shift_JISなどで保存された古いファイルは化けて表示されるためです。

  1. 画面右下のステータスバーに表示されている文字コード(「UTF-8」など)をクリックします。
  2. 表示されたメニューから「エンコード付きで再度開く」を選びます。
  3. 文字コードの一覧から、正しいもの(Shift_JISのファイルなら「Japanese (Shift JIS)」)を選びます。
    保存していない変更は破棄されるので、先に保存しておきましょう。

正しく表示できたら、同じメニューの「エンコード付きで保存」でUTF-8を選んで保存すると、次からは普通に開けるようになります(VS Codeのドキュメント(英語))。

ほかのテキストエディタでも、ファイルを開く画面や保存する画面で文字コードを選べることが多いので、メニューを探してみましょう。

zipファイルのファイル名が文字化けするとき

受け取ったzipファイルを展開したら、中のファイル名だけが文字化けしている場合は、zipを作ったパソコンと開いたパソコンで、ファイル名の文字コードの扱いが違うことが原因です。

zip形式は、もともと日本語のファイル名を想定しておらず、あとから「ファイル名をUTF-8で記録した」という目印が追加された経緯があります(zip形式の仕様書 APPNOTE.TXT(英語))。

この目印を付けずに、パソコンの標準の文字コード(日本語版の古いWindowsではShift_JIS系)でファイル名を記録するソフトもあり、そのzipをMacなど別の環境で開くと、ファイル名が化けてしまいます。

ファイルの中身は無事なことが多いので、ファイル名の文字コードを指定して展開できるソフトを使うか、送り主にファイル名を英数字にして作り直してもらいましょう。

文字化けの復元・解読の考え方

文字化けした文字は、条件がそろえば元に戻せますが、戻せないものもあります。

ここでは、戻せる場合と戻せない場合の見分け方と、化けた文字を自分で解読する考え方を紹介します。

ファイルが手元にあれば読み直すだけで戻る

文字化けしたファイルそのものが手元にあるなら、正しい文字コードで開き直すのがいちばん確実な復元方法です。

表示が化けていても、ファイルに保存されたバイトの並びは変わっていないので、読み方を合わせれば完全に元の文字に戻るためです。

早見表で文字コードの見当をつけ、ここまでに紹介したブラウザ・Excel・VS Codeの方法で開き直してみましょう。

ファイルを開き直すだけなら元のデータは変わらないので、いろいろな文字コードを試しても問題ありません。

化けた文字列から元の文字を解読する

ファイルがなく、化けた文字列だけがコピーで手元にある場合は、「間違った読み方を逆にたどる」ことで解読できることがあります。

化けた文字列を、間違えて使われた文字コードでバイトの並びに戻し、それを正しい文字コードで読み直せば、元の文字が現れるという考え方です。

たとえば、プログラミング言語のPythonでは、次のコードで「縺薙s縺ォ縺。縺ッ」を「こんにちは」に戻せます。

garbled = "縺薙s縺ォ縺。縺ッ"
print(garbled.encode("cp932").decode("utf-8"))  # こんにちは

encode("cp932")で、化けた文字列をShift_JIS(cp932はWindowsで使われるShift_JISの一種)のバイトに戻し、decode("utf-8")でUTF-8として読み直しています(使える文字コードの名前はPythonのドキュメント「標準エンコーディング」で確認できます)。

早見表で原因の組み合わせ(どの文字コードをどの文字コードとして読んだか)が分かれば、この2つを入れ替えるだけで、ほかのパターンも同じように解読できます。

元に戻らない文字化け

一方で、文字化けの途中で情報が失われていると、どんな方法でも完全には元に戻りません。

戻すための手がかりになるバイトが、「?」や「�」に置き換えられた時点で消えてしまっているためです。

状態戻せるか
化けたファイルそのものが手元にある戻せる(正しい文字コードで開き直す)
化けた文字列だけがあり、「�」が含まれていない戻せることが多い(逆にたどって解読する)
化けた文字列に「�」が含まれている一部だけ戻る(「�」の部分の文字は失われている)
「?」に置き換わって保存されている戻せない(元のデータから作り直す)

たとえば「文字化けを直す」をShift_JISとして読んだ「譁�蟄怜喧縺代r逶エ縺�」から逆にたどると、「�」になった部分が失われているため、「�?字化けを直�?」のように一部しか戻りません。

化けたファイルを開いたまま上書き保存すると、こうした失われた状態でファイルが保存されてしまうので、元に戻すまでは上書き保存しないように注意しましょう。

文字化けを防ぐ作る側の対策

Webページやファイルを作る側が文字コードをきちんと指定しておけば、見る人の環境で文字化けが起きるのを防げます。

ここでは、Web制作で押さえておきたい3つの対策を紹介します。

HTMLはmeta charsetでUTF-8を宣言する

HTMLが文字化けしないようにするには、head要素のはじめに<meta charset="utf-8">を書きます。

これは、ブラウザに「このページはUTF-8で書かれています」と伝えるための宣言で、HTMLの仕様では、文字コードはUTF-8でなければならず、この宣言は文書の最初の1024バイト以内に収める必要があると定められています(HTML Living Standard(英語)、MDN「<meta>」)。

次のように、head要素の最初に書いておくのが確実です。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>ページのタイトル</title>
</head>

同じheadまわりに書くlang="ja"は、文字コードではなく「ページの言語」を伝えるもので、役割が違います(違いはhtml要素 lang="ja"は本当に必要?で解説しています)。

HTMLの基本的な書き方から確認したい場合は、HTMLとは?も参考にしてください。

ファイルの保存もUTF-8でそろえる

meta charsetでUTF-8と宣言したら、HTMLファイルそのものもUTF-8で保存します。

宣言はあくまで「この文字コードで読んでください」というお願いなので、実際の保存の文字コードと違っていれば、ブラウザは間違った読み方をして文字化けするためです。

エディタの画面(VS Codeならステータスバー)で、ファイルの文字コードがUTF-8になっているかを確かめましょう。

また、Webサーバーが送る情報(HTTPのContent-Typeヘッダー)で文字コードが指定されていると、ブラウザはページの中のmeta charsetよりもそちらを優先します(HTML Living Standard「文字コードの判定」(英語))。

ファイルもmetaも正しいのに化けるときは、サーバーの設定でShift_JISなどが指定されていないかを確認してください。

Excelで開くCSVはBOM付きUTF-8にする

自分のサービスやプログラムから、Excelで開かれる可能性のあるCSVを書き出すときは、BOM付きのUTF-8で保存します。

前の章で紹介したとおり、ExcelはBOM付きのUTF-8のCSVなら、ダブルクリックで開いても文字化けせずに表示できるためです(Microsoftサポート)。

UTF-8のBOMは、ファイルの先頭に付けるEF BB BFの3バイトで、Pythonではencoding="utf-8-sig"を指定して書き出すと自動で付きます。

ただし、BOMを想定していないプログラムで読み込むと、先頭の項目名に余計な文字が付いたように扱われることがあるので、CSVを受け取るのが人(Excel)かプログラムかで使い分けましょう。

文字化けの注意点とよくある質問

文字化けを直すときにやってしまいがちな失敗と、よくある疑問をまとめます。

注意点・よくある間違い

  • 文字化けしたファイルを開いたまま、上書き保存してしまうことがあります。
    化けた状態で保存すると、元に戻すための情報が失われることがあるので、直すまでは保存せず、念のため元のファイルのコピーを取っておきましょう。
  • Excelで開いて文字化けしたCSVを、そのままExcelで保存し直してしまうことがあります。
    化けた文字のまま保存されてしまうので、「データの取得」で文字コードを指定して読み込み直してから作業しましょう。
  • HTMLでmeta charsetを宣言しただけで安心してしまうことがあります。
    ファイルの保存の文字コードやサーバーの設定とそろっていなければ化けるので、3つがすべてUTF-8になっているかを確かめましょう。
  • 絵文字や特殊な記号を含む文章を、Shift_JISで保存してしまうことがあります。
    Shift_JISで表せない文字は「?」に置き換わって戻せなくなるので、新しく作るファイルはUTF-8で保存しましょう。
  • 文字化けを直すために、化けた文章を素性の分からないWebサイトに貼り付けてしまうことがあります。
    メールや業務のファイルには個人情報や社外秘の情報が含まれていることがあるので、まずはこの記事の方法のように、手元のソフトで開き直して確かめましょう。

よくある質問

  • Q. 文字化けは英語で何という?
    A. 英語では「garbled text(崩れた文字)」などと表現され、日本語をそのままローマ字にした「mojibake」という言葉も使われます(Unicode「Display Problems?」(英語)でも、文字化けを「mojibake」と呼ぶことがあると紹介されています)。
    英語のソフトや海外のサービスで日本語が化けるのは、UTF-8のデータを欧米向けの文字コードとして読んだときが多く、「ã」「æ」などが並ぶのが特徴です。
  • Q. 文字が「□」で表示されるのも文字化け?
    A. 原因が違います。
    「□」になるのは、文字コードは正しく読めているものの、その文字の形のデータ(フォント)がパソコンやスマホに入っていないときです(Unicode「Display Problems?」(英語))。
    新しい絵文字などで起きやすく、OSを更新したり、その文字に対応したフォントを入れたりすると表示されるようになります。
  • Q. 自分のパソコンでは正しく見えるのに、相手の環境で文字化けするのはなぜ?
    A. 自分のソフトは文字コードを正しく推測できていても、相手のソフトは別の文字コードで読んでいる可能性があります。
    ファイルをUTF-8で保存し、HTMLならmeta charset、CSVならBOMで文字コードを明示すると、相手の環境に左右されにくくなります。
  • Q. 文字化けを直してくれる変換ツールを使えばいい?
    A. 化けた文字列だけが手元にあるときは、変換ツールで解読できることもあります。
    ただし、ツールがしていることも「どの文字コードをどの文字コードとして読んだか」を逆にたどる作業なので、ファイルがあるなら、正しい文字コードで開き直すほうが確実で、情報を外に出す心配もありません。

まとめ

文字化けとは、保存したときと読み込むときの文字コードが食い違い、別の文字として表示されてしまう現象です。

多くの場合データは壊れていないので、化け方の見た目から元の文字コードを推理し、正しい文字コードで開き直せば元に戻ります。

ただし、「?」に置き換わって保存されたものは戻せないので、化けたファイルは直すまで上書き保存しないことが大切です。

作る側は、ファイルの保存・HTMLのmeta charset・サーバーの設定をUTF-8でそろえ、Excel向けのCSVはBOM付きにしておくと、文字化けを防げます。

まずは、いま使っているエディタのステータスバーや保存の画面で、自分のファイルがどの文字コードで保存されているかを確かめてみましょう。