彩りの大地 うぇぶでざいん

ぺぇじへっどらいん

文字コード指定保存における勘違い

高度なお話。ウェブページ作成には直接関係しないので、あくまでウェブページ作成だけが目的の方は飛ばしてよい。

おさらい

これについてメモ帳の話から説明すると……使い勝手がよろしくないので使う可能性はないと思いますが、一応。
他のテキストエディタであれば文字コードを指定して保存する機能を持ち合わせていますが、こいつだけは例外です。
保存時の選択として、ANSIかUnicode(UTF8かUTF16(ビッグエンディアン/リトルエンディアン))しかありません。
なんだろANSIって……それに他のコードないじゃん、意味が解らん……そう思った人、簡単な話です。

ANSIはOSで使える文字の中でも原始と言える存在で、文字コードにかかわらず、常に同じアドレスで呼び出されます。 なお、そのANSIコードというのは基本的に半角文字のアルファベットや数値と記号などで構成されているものです。
ということはつまり、ANSIの範囲の文字は(2バイト)文字コードの範囲外の文字であり、 だったら(2バイト)文字コードの範囲内の文字が保存されたら、その文字はどう扱われるんだと考えるわけですが、実はそんなに難しい話ではありません。

Shift_JIS(ASCII・半角文字混在型) 日本語WindowsOS標準

はーい、そうでーす。正解はShift_JISでーす。
日本語Windowsを使っているので文字コードはつまりOS依存のShift_JISになります。
(もちろん、ほかの言語のWindowsだったらそちらに従う動作になります。)
そのため、TeraPadだろうがサクラエディタだろうが、特に設定や指定が無ければデフォルトでShift_JISでの保存が選択されるわけです。 ということはつまり、ほかの言語のWinOSを使う場合はまた違う文字コードが指定されるので注意が必要だと思えばいいです。

ここから高度な話

ということで、ここで気にしておく必要がある点はわかったかと思います。 それは、(2バイト)文字コードの関係ないテキストを日本語WindowsOSで開く場合の動作についてです。
まず、繰り返しになりますが、ANSIコードは(2バイト)文字コード体系とは関係のない文字群です。 そのため、ANSIコードのみで構成されているテキストファイルは(2バイト)文字コードの影響は受けません。 それがたとえUTF8で開こうがShift_JISで開こうが、EUC-JPで開こうが同じなのです。
つまり、ANSIコードのみ(空ファイルも同様)で構成されているテキストファイルには(2バイト)文字コードという扱いが無いので、 日本語WindowsOSの場合、どのテキストエディタも無条件でOS依存のShift_JISで開こうとするのです。

実際にやってみるとわかります。 テキストエディタでANSIコード内の文字のみを使ってファイルを保存します。 たとえばTeraPadを用いて「test」という文字列で保存する際にUTF-8を指定して保存します。
test.txt
そしていったん閉じて、再度そのファイルをTeraPadで開いてみるとどうでしょうか、 SJIS(Shift_JIS)で開かれていることがわかります。

は?何言ってんの?ちゃんとUTF8で開くか聞いてくるじゃねーか、デタラメいってんじゃねーぞ!
そう思った方、さてはTeraPadではありませんね。
サクラエディタでtest.txt
サクラエディタでtest.txt open
画像ではサクラエディタで同様のことをやった場合ですが、Open時に文字コードの問い合わせがあります。 前回保存した際の文字コードはUTF8だが、どういうわけかSJISで開こうとする謎の挙動が見られます。
つまり、SJISで開こうとしているのはあくまで保存状態がSJISであるためで、 UTF8を指定して保存したハズが、実際にはSJISで保存されていることがわかります。
サクラエディタでこのような問い合わせがあるのはサクラエディタ側で情報を保持しているためにおこることであり、 実際に保存場所を移動やコピーなどして変えてから開いてみる(キャッシュが働いているせいか、移動だけではダメだったような気がする) とこのような問い合わせはなく、無条件でSJISで開く動作となります。
要はあくまで無条件でJPのWindowsOS依存のShift_JISで開かれることになるということです。

何故そんな動作になるのかというと簡単なことで、 ANSIコードについてはどのOS(基本はUNIX系)でも扱える文字の中では原始的な存在であることから、 異OS間でも一定の文字アドレス帯には必ず同じ文字アドレスを格納しています。
つまり、ANSIコード体系のみのファイルの場合、ファイルに文字コード情報まで保存する必要がないため、 わざわざ保存するようなことまではしていません。
そして、JPのWindowsOSは文字コード情報がないファイルについてはOS独自の判断で自分のファイルシステム標準の文字コードで開こうとしているため、 勝手にShift_JISだと解釈してShift_JISで開くようになっていると、ただそれだけの話なのです。
そしてサクラエディタは、そのうえで前回そのファイルを保存した際の文字コード情報を独自に保存しているため、 ユーザに対する問い合わせが発生し、どうするかユーザにゆだねています。
(逆に保存内容が「テスト」という文字コード依存の内容を格納している場合は無条件でUTF8で開かれるハズです。)

だからもし、「UTF8で保存しろって言ったのになんで変わってないんだ!」「UTF8で保存しろといっただろ!」などと、 どこそかのボンクラSE……ロートルSE……老害……三流SE……無能SE……とにかくどっかのマヌケなSEがそんなことをほざき始めたら、 自分たちのプロジェクトが恥をかく前にちゃんと説明してあげてください(※)。
※体験談。しかも一番やらかしてはいけないレベルのSEがやらかしているレベルなので、 案外SEのハードルなんてもんは低いもんです。正直、誰でも簡単にSEになれると思います、困ったもんだ。

ということはつまり、CSSとJSも2バイト文字(日本語)を使うと文字コードを考えないといけないということになります。 こちらも保存時に漏れなく文字コードを指定してあげてください。
当然、ANSIコードだけで構成されているファイルであればその必要はありませんが、 ファイル内にコメントやJSで日本語の文字列を使っている場合などはやはり文字コードの対象となるため、 きちんと文字コード指定保存まで考えましょう。