用語の定義
文字エンコーディング
文字セットで定義された数値をどのように符号化するかの
ルールを決めたもので、UTF-8, Shift-JIS, EUC-JPなどが
文字エンコーディングといわれるものです。
まちがって僕はこの文字エンコーディングのことを文字コードと呼んでいました。
厳密にいうと文字コードはたとえば文字や記号一つ一つに
割り当てられた固有の数字のことで、
ASCIIならAは0x41だというのが文字コードです。
文字セット
Unicodeとかいうものがそれにあてはまります。それに含まれるのが
UTF-8だったりUTF-16だったりします。
ここまでは、みなさんそんなに混乱しないのですが、
Visual C++を使っていてマルチバイト文字だのワイド文字だのというのがありますよね。
最近のVisual C++既定ではUnicode文字セットを使用するとなっています。
ちなみに、世の中の定義とどうも乖離があるVisual C++での
マルチバイト文字とUnicode文字セット(ワイド文字)ですが、
マルチバイト文字セット(MBCS※Visual C++での定義)とは、
文字によって1バイトだったり2バイトだったりするものです。
Unicode文字セット(ワイド文字)とは文字によって原則不変のものです
(たとえばUTF-16がそれにあたります(例外有)。
で、ここで僕が勘違いしていたこと。
UTF-8はUnicodeだから
UTF-8で記述されているファイルを扱うときは必ず
Unicode文字セットで扱うものだと…
そうじゃなくて、
Visual Studioで指定しているマルチバイトやらUnicode文字セットは
内部的に使う文字コードの話なのです。
UTF8:ASCIIの範囲は1バイト、日本語は3バイトのことが多いらしい。
UTF-16:文字関係なくたいてい2バイト。Windows内部で処理している文字エンコーディングはこれ。
補足
よく勘違いしやすいのですが、プログラムが内部で処理している文字列と、
ファイルとして出力されるときの文字列は別物です。
VC++とかで設定する文字というのはプログラムが内部で処理しているときの文字です。
なので、変換さえ可能であれば出力は別のものにすることができます。
追記
LinuxのC言語(GCC)とWindowsのC言語(Visual C++)では
UTF-8のファイルの扱い方が全然違う模様。
LinuxではロケールがUTF-8環境だったら
char型で別に何の問題もなくUTF-8を処理しますが、
Windowsの場合UTF-8でファイルを書いたりする場合は、
fopenに特殊なフラグを付けないといけないばかりか、
ワイド文字のほうのwchar_tを使用しないとダメだとわかりました
(もちろんTCHARでもよい)。
ためしにUTF-8とUTF-16で保存するコードを書いてみました。