文字化けの仕組み もともとASCII(アスキー)という、アメリカで規格化されたアルファベットや制御文字(改行やタブなど)と若干の記号だけの文字コードがありました。 文字コードというのは、文字がどのように符号化されるかの規則。 そもそもコンピュータは、メモリ、フラッシュストレージ、ハードディスク、CPUの論理素子など全て、突き詰めるとONかOFFか(0か1か)で表現、制御されているというのは聞いたことがあると思います。ハードディスクであれば、円盤上に同心円状に配置された小さい磁石の粒がS極かN極か。計算を実行するCPUであれば、トランジスタという電子的なスイッチが導通するか遮断するか、という2つの状態しか取ることがありません。これをデジタル制御といいます。対義語はアナログ制御です。 原理的に離散的な値しか扱うことができないデジタルに対して、アナログは連続的な値を扱うことができますが、通信などに使う場合にノイズによる劣化が起こる欠点があります。(VHS➖昔のビデオテープのダビングを繰り返したり、コピー機でコピーのコピーを取ったりするときのような)。デジタルの場合、ONかOFFかなので白黒はっきりしていてノイズに影響されづらいことに加えて、エラー訂正の仕組みを加えることができるので、通信(これはコンピューター内部の通信も含みます)の信頼性に優れます。 0か1の状態を取れるものがひとつあると、これを1ビット(bit)といいます。0か1かより大きな情報を表すときには複数のビットを使います。2ビットあると、 00, 01, 10, 11 の4つ(2の2乗)の状態を表すことができます。 3ビットなら 000, 001, 010, 011, 100, 101, 110, 111 の8個(2の3乗)。ビットの数をnとすると、2のn乗の状態を表現できることになります。 文字コードの話に戻ります。コンピュータは0か1しか記憶できないので、当然文字も01の羅列でストレージに格納されたり、通信されたりします。 ASCIIは8ビットで、例えば Aは 01000001 Bは 01000010 Cは 01000011 などと符号化されます。(参照 https://www.ibm.com/docs/ja/aix/7.1?topic=adapters-ascii-decimal-hexadecimal-octal-binary-conversion-table ) 慣習的に、8bitのことを1バイト(byte)と呼びます。(歴史的には1byteは1文字を表すのに必要なビット数の呼び名だったので、コンピュータアーキテクチャによって違いがありました。大昔の話です) 8bitでは2の8乗、つまり256個の文字しか表現できません。ヨーロッパのラテン文字などの表音文字の場合、256文字に収まるものもありましたが、漢字など表意文字を使う言語では圧倒的に足りません。そこで、マルチバイト(multi-byte 複数のバイト)文字というものが、言語ごとに作られるようになり、日本語用の文字コードとして、ISO-2022-JP(=JIS)、Shift_JIS、EUC_JPなどが作られました。詳細は省きますが、それぞれビット数を節約するための機構や、ASCIIとの互換性のための仕組みに違いがあります。MicrosoftのWindowsではShift_JISが採用されました。メモ帳などではつい最近までShift_JISで保存されていました。 Unix,Linuxなどでは主にEUC_JPが使われてきました。Macは昔はMacJapaneseというShift_JISをもとにした独自コードを使っていたそうです。OSXはUTF-8(後述)です。このことが原因で、今でもwindowsで作ったzipファイルをMacで開くと文字化けしたりします。 言語ごとに文字コードが違い、更にひとつの言語に対しても複数の文字コードがあるという状況でした。国際化の観点から、ひとつのWebページに複数の言語を混在させたりする需要などが高まって、もっとたくさんのbyteを使って、あらゆる言語から絵文字まで網羅できる文字コードが構想され、ユニコードと名付けられました。コンピュータのメモリや処理速度の進化によって、このような大きな文字コードの使用が現実的になりました。ユニコードにはUTF-8, UTF-16,UTF-32などがあります。このうち16と32は固定長(1文字は必ず16ビットないし32ビット)、UTF-8は可変長(単純な文字8ビット、複雑なものは最大32ビット)で表現されます。可変長のものは処理が若干重たい分データ量が少なくなるので、UTF-8がよく使われています。 現在、Webでは圧倒的にUTF-8が多く使われています。HTMLを書くテキストエディタも、標準でUTF-8でファイルを保存するものが多いです。Webブラウザもデフォルトの文字コードがUTF-8になっているものが多いのですが、例外もあります。なので、ファイルの文字コードをWebブラウザに正しく認識させるために、という宣言が必要になります。 Webページで文字が正しく表示されるためには、ファイルの文字コードと、meta charsetの文字コードが一致している必要があります。 以上です。 [image: utf-8.png] UTF-8では、よく使われる漢字は3byteで表現できるそうです。 参考 文字コードについて、簡単な解説と、https://gihyo.jp/book/pickup/2019/0006 詳細な解説 https://www.buildinsider.net/language/csharpunicode/01 文字化けのパターン https://tools.m-bsys.com/ex/html-mojibake.php UTF-8 UTF-16 UTF-32の違い https://elite-lane.com/difference-between-unicode-and-utf-8-and-utf-16-and-utf-32/ など