コンピュータを使ううえで時々起こる文字化け問題。これまでこのやっかいな問題を、基本を勉強することなく中途半端な知識のままこの対処しようとして多くの間違いを犯してきたため改めて勉強し直してみることにしました。
文字コードの問題を考えるにあたり符号化文字集合と、文字符号化方式(エンコーディングスキーム)は区別されます。特に、Unicode系では厳密に区別されていますので注意が必要です。ウィキペディアでは次のように解説されています。
符号化文字集合を定義した段階では、単に使用可能な文字と符号(Unicodeスカラー値、符号位置、区点位置、コード・ポイントなど)が関連付けられただけの状態であり、コンピュータ上でどのようなバイト列として取り扱うかは定義されない。 この「符号」からバイト列に変換する方法は、文字符号化方式という別の概念として定義される(Shift_JIS や UTF-8等)。 ただし、JIS X 0201, JIS X 0208, JIS X 0213等における符号化文字集合では、文字とビット組合わせをの関連付けを行っているので、Unicode等と異なり文字符号化方式の概念は明確ではない。
つまり、どの文字をどの符号(コード)にマッピングさせるかを定義したものがキャラクタセット(文字集合)、この符号をコンピュータ上でどのようにバイト列に変換するかを定義したものをエンコーディングスキームと呼ぶわけです。同じ、符号化文字集合であっても符号化方式がが異なればコンピュータ上での表現が異なることになります。
例えば、JIS X 0208は符号化文字集合であり、これらで定義された文字集合をどのようにコンピュータ上表現するかを規定するのがShift_JIS/EUC-JPということになります。ただ、実際にはこれらの表現は曖昧なことも多くそこが文字コードを勉強するにあたっての落とし穴のひとつになっているように思います。