文字化けを直す
貼り付けると同時に復元します。Ctrl + Enter で結果をコピーします。
なぜ文字化けが起きるのか
コンピュータが保存しているのは文字ではなく、バイトの並びです。 文字をバイトに変える規則を符号化、バイトを文字に戻す規則を復号といい、 この2つに使う規則(文字コード)が食い違ったときに文字化けが起きます。
たとえば「日本語」を UTF-8 で保存すると E6 97 A5 E6 9C AC E8 AA 9E という9バイトになります。
これを Windows-1252 という別の文字コードとして読むと、1バイトずつ別の文字に割り当てられ、
日本語 という9文字になります。
データが壊れたわけではなく、同じバイト列を違う規則で読んだだけです。
したがって復元は、逆をたどれば済みます。 化けて見えている文字列を、いま読まれている文字コードでバイトに戻し、 本来の文字コードとして読み直します。
見た目からどの化け方か分かる
化け方には型があります。並んでいる文字の傾向を見れば、何と何を取り違えたのかが分かります。
| 見た目 | 元の文字 | 起きたこと |
|---|---|---|
縺薙s縺ォ縺。縺ッ螟画鋤 |
こんにちは 変換 |
UTF-8 のファイルを CP932(Windows の Shift_JIS)として読んだ |
日本語テスト |
日本語 テスト |
UTF-8 のテキストを Windows-1252 として読んだ |
ハムエケ・ニ・ケ・ネ |
変換 テスト |
EUC-JP のデータを CP932 として読んだ |
日本語 |
日本語 | UTF-8 を Windows-1252 として読む取り違えが、2回続けて起きた |
特徴で見分ける
- 「縺」「繧」「繝」「蜀」が多い — UTF-8 を CP932 として読んでいます。Windows の日本語環境でよく起きます
- 「ã」「â」「Â」が多い — UTF-8 を Windows-1252 として読んでいます。Web とメールでいちばん多い型です
- 「Ã」で始まる組が並ぶ — 同じ取り違えが2回起きています。長さが元の3〜4倍に膨らみます
- 半角カナだけが並ぶ — EUC-JP を CP932 として読んでいます。古い掲示板やメールに残っています
- 見えない文字が混ざる — ISO-8859-1 として読んだ場合です。Windows-1252 とほぼ同じ見た目ですが、記号の一部が表示されない文字になります
- 「�」や「?」が混ざる — その部分のデータはすでに失われています。下記を参照してください
復元できないことがある
すべての文字化けが直せるわけではありません。 読み込みの時点で、バイトが捨てられてしまう場合があるからです。
文字コードには「このバイトの並びは存在しない」という組み合わせがあります。
読み手はそこに来ると、元のバイトを捨てて U+FFFD(�、置換文字)という
1文字に置き換えます。置き換えられた時点で、元が何バイトだったのかも、どんな値だったのかも残りません。
これは UTF-8 のファイルを Shift_JIS として読んだときに特に多く起きます。
UTF-8 の3バイトの並びの多くが Shift_JIS では成立しないため、あちこちが � に潰れます。
譁�ュ怜喧縺代r逶エ縺� のように � が混ざっていれば、その箇所はもう戻せません。
できることは、化けていない元のデータを入手し直すことだけです。
- メールなら、送信者に「UTF-8 で送り直してほしい」と依頼する
- ファイルなら、コピーではなく元のファイルを受け取り直す
- Web ページなら、ブラウザの文字コード指定を変えて読み込み直す。画面から本文をコピーした時点では、すでに
�に潰れています - データベースやログなら、画面表示ではなく元のバイト列を直接取り出す
なお � が見えなくても、表示しているソフトが伏せているだけの場合があります。
化けた文字列は画面からコピーするより、元のファイルをそのまま扱うほうが確実です。
化けを防ぐには
ファイルを保存するとき
- 文字コードは UTF-8 を選びます。現在はこれが既定と考えて構いません
- Excel の「CSV」は環境によって CP932 で保存されます。「CSV UTF-8」を選ぶか、保存後に文字コードを確認します
- UTF-8 には BOM の有無という違いもあります。読み手のソフトが対応していない場合、先頭に
が出ます
メールを送るとき
- 送信時の文字コードを UTF-8 にします。古い設定のまま ISO-2022-JP になっていることがあります
- 件名に絵文字や機種依存文字(①、㈱、ローマ数字など)を入れると、受信側で落ちることがあります
プログラムから読み書きするとき
- ファイルを開くときに文字コードを明示します。省略すると実行環境の既定が使われ、環境ごとに違う結果になります
- データベースは接続時の文字コードもそろえます。テーブルの設定だけでは足りません
- HTML には
<meta charset="utf-8">を、<head>の先頭近くに書きます