文字化けとは、コンピュータで文字を表示する際に、正しく表示されなくなってしまう現象のこと。

例として「文字化け」が、「 æ–‡å­—åŒ–ã‘ 」や「譁�ュ怜喧縺�」と表示されるなど。

「文字化け」という言葉は、コンピュータ環境で原則としてマルチバイト文字を使用しない欧米等のラテンアルファベット使用言語においては該当する用語が存在しなかったことから、日本語 の “Mojibake”という言葉がそのまま通用するようになった。→#Mojibake

## 主な原因

ソフトウェアやハードウェアの不具合 (trouble)、文字コードの違い、エンコーディングとデコーディングの不一致、文字フォントの違いなどが原因となる。パソコン通信の時代は、ハードウェア上の文字化けが頻発した。インターネットの普及後は、運用系(オペレーティングシステム)、ブラウザ等ソフトウェアに起因する文字化けがある。

コンピュータ上で文字データを扱う際は、文字セットに含まれる各文字に何らかの整数値あるいはバイトシーケンスを割り当てた文字コードを用いる。例えばASCIIではアルファベット小文字のaに10進数で97(16進数で6116)の数値を割り当てている。通信によって文字データを送受信する際、送信する側と受信する側で同じ文字コードを使うことによって、初めて正しいデータ交換が成立する。文字データをテキストファイルなどに保存し、後で開いて読み取る場合も同様である。エンコードする側とデコードする側で、お互いが同じ文字コードを使っている限りは問題は起こらないが、その前提が崩れたときに文字化けが発生する。

### 文字コードの大きさ

1バイト文字だけを表示しようとするシステム、2バイト文字だけを表示しようとするシステム、国際規格に対応するすべての文字を表示しようとするシステムなど、どの大きさの文字コードが表現できるかの違いが存在する。

### 文字コードの違い

文字コードには表現できる文字の範囲などに違いがある。単一の言語にしか対応していない文字コードもあれば、Unicodeのように複数の言語に対応している文字コードもある。例えば日本語に対応していないASCIIやISO/IEC 8859-1(Windows-1252)のような欧米発祥の文字コードでは日本語の文字を扱うことはできない。JIS X 0208のような日本語の文字集合に対応している文字コードであっても、ISO-2022-JP、EUC-JP、Shift\_JIS、あるいはUTF-8/UTF-16などのように複数の文字コードやエンコーディング方式が存在し、ASCIIの範囲内にある共通の文字を除いて、同じ文字であっても異なる整数値や異なるバイトシーケンスを割り当てていることが多い。同じShift\_JIS系列の実装であっても、Microsoftコードページ932とMacJapaneseのように、それぞれ独自拡張が加えられており、いくつかの文字に互換性がない文字コードもある。そのため、特定の文字コードで表現できていた文字列を、他の文字コードで表現しようとすると、対応処理の誤り、対応する文字が存在しないことなどから、正しい文字を表現できず、無関係の文字が表示されてしまったり、強制的に変換されて別の文字に置き換えられてしまったりする。

文字化けしたメール例

|  |  |
| --- | --- |
| Unicode (UTF-7) | ���̃�� (�q���Y�\_�C�G�b�g) |
| Shift\_JIS | 縺薙・繝。繝シ繝ォ縺ッ 繝シ縺ョ逧・ァ倥∈縺ョ繝。繝・そ繝シ繧ク縺ァ縺吶€・ |
| Unicode (UTF-8) | このメールは 皆様へのメッセージです。 |
| Latin-1 | ã?“ã?®ãƒ¡ãƒ1⁄4ãƒ«ã? ̄ Šãƒ1⁄4ã?®çš†æ§ ̃ã? ̧ã?®ãƒ¡ãƒƒã‚»ãƒ1⁄4ã‚ ̧ã?§ã?TMã€‚ |
| US-ASCII | c c .c !c <c +c / c c c <c .g f' c 8c .c !c c ;c <c 8c 'c c |
| アラビア語 | ك?“ك?كƒكƒكƒك? كƒك?هš†ن ̃ك?ك?كƒكƒƒك‚؛كƒك‚ك?ك?TMك€‚ |

### 文字コードの実装

文字コードによってはすでに割り当てられている文字の変更を許容していたり、新たに任意の文字を割り当てられる拡張領域を設けていたりするものがある。また、文字コードのアップデート(仕様変更)によって字形が変更されることがある。同じ文字コードでもどの実装が採用されているかによって、表示が異なったり表示ができなかったりする。

### エンコーディング

1バイト文字と2バイト文字を同時に表示しようとするシステムでは、前から後ろへの検索においては、1バイトと2バイトの違いが確認できる。後ろから前への検索においては、1バイトと2バイトの違いが確認できる文字コードと確認できない文字コードがある。そのため、タグ付き文字列の場合には、これらの処理の違いを確認できるような文字コード、文字フォントに対するタグをつけることがある。エスケープシーケンスも、ここではエンコーディングに分類する。

### 文字フォントの違い

文字フォントによって、表現できる文字の範囲に違いがある。そのため、オペレーティングシステム (OS)、ソフトウェア(ブラウザ等)が対応できる文字フォント、あるいは導入済みの文字フォントの種類によって表現できないことがある。1バイト文字には1バイト文字フォント、2バイト文字には2バイト文字フォントを別々に指定できるソフトウェアもあるが、画一的に1種類の文字フォントしか指定できないソフトウェアもある。

### 特定の機能指定

ファイル名、フォルダ名などで、ソフトウェアでは2バイト文字を使うと文字化けすることがある。これは、特定の機能が、1バイト文字を想定した設計になっている場合か、2バイト文字であっても特定の文字集合だけを想定した設計になっている場合である。

### 文字切れ

2バイト文字などを想定せずに設計したソフトウェア、通信機能では、文字の長さに制約があり、2バイト文字で表現した場合に、タグ、エスケープシーケンス、拡張符号などの挿入により、制限で指定している文字列の長さより短い状態で文字切れすることがある。また、この文字切れが2バイト文字の1バイト目で終了している場合には、それ以降の文字表現が文字化けすることがある。

## 主な現象

### プログラムの日本語対応の甘さによるトラブル

Shift\_JISを内部コードに利用するアプリケーションでは、エスケープシーケンスの取得の仕方に一工夫必要である。ところがそれがなされていないため問題となる場合がある。海外のアプリケーションの日本語対応時に特に現出しやすい。

Shift\_JISにおいて、2バイト目が0x5c(日本の円記号、ASCIIではバックスラッシュ)となる文字(「申」「能」「表」など、俗に言う「ダメ文字」)の場合、2バイト目の0x5cがエスケープを意味する制御文字として動作することがあり、正しく表示できなくなる場合がある。

### 通信経路でのトラブル

通信や記録の段階で、文字データの一部が欠落・変質してしまった結果として、文字データが意味不明な文字列として表示されてしまうこともある。

- ASCIIやISO-2022-JPなどの7ビット符号以外の文字をBase64やQuoted-printable等のエンコーディングなしに、7ビット系通信路で送受信しようとした場合、上位1ビットが削除され文字化けする結果となることがある。
- OSやプロトコル毎に改行を表す制御コードの指定が違うため、変換に失敗するとその部分が化けることもある。
  - Windows → CRLF(0x0D 0x0A)
  - Classic Mac OS → CR(0x0D)
  - macOS → LF (0x0A)
  - UNIX → LF (0x0A)
  - ChromeOS → LF (0x0A)
  - メール本文 → CRLF (0x0D 0x0A)

### 表示能力の無いアプリケーションを利用した場合のトラブル

ワープロソフトで独自のフォーマットを使用して保存したファイルを、別のワープロソフトやテキストファイルしか読み込むことができないアプリケーションで開いた場合に文字化けが発生する。ワープロソフトによってはバージョンが異なるだけで文字化けを起こすこともある。

文書ファイルでないファイルをワープロソフトなどで開こうとした場合にも理解できない文字列として表示され、これも文字化けに含めることもある。

## Mojibake

英語など各言語では、「文字化け」を「mojibake」と日本語のローマ字表記で使用することが定着している。

これは、米国のアルダスで日本語版などのソフトウェアの開発を行っていた久保芳之がページメーカーのソフトウェアを開発する過程で文字化けが発生することを説明するために「mojibake」という言葉を使用していたことが、その後Macintoshの関連業界で普及し、そのまま定着したことによる。