MSYS2で日本語表示を試してみましょう。
サクラエディタで次のような内容のテキストファイル「hello2.c」を作成します。
#include <stdio.h>
int main(void)
{
printf("こんにちは世界\n");
return 0;
}
さらに「gcc -o hello2 hello2.c」を実行して下さい。「hello2.exe」というEXEファイルができれば成功です。 「./hello2.exe」と入力して「Enter」キーを押せば、「こんにちは世界」と表示され、、、 なくて、文字化けします。
これは、Windowsのテキストファイルの文字セットがShift_JIS(シフトジス)で、 MSYS2で使われているBash(バッシュ)というシェルでは、文字セットがUTF-8(ユーティーエフ・エイト)であり、 文字セットが違うので、文字データの解釈が違うから、文字化けが起こったのです。
「文字セット」「文字集合」「文字コード」「エンコーディング」「文字符号化方式」、様々な言い方がありますが、 同じ意味です。文字列をどのようにバイト列で表すのか、バイト列をどのようにテキストとして解釈するかを 意味します。
一番有名な文字セットはASCIIです。日本語の文字セットは、Shift_JIS、UTF-8、UTF-16などがよく使われます。
参考資料: 文字集合、 ASCII、 Shift_JIS、 UTF-8、 UTF-16
サクラエディタで「ファイル」メニューから「名前を付けて保存」を選び、「文字コードセット」で「UTF-8」を選んで 保存しなおし、再ビルドすると、正しく「こんにちは世界」と表示されます。
次に、Visual Studio 2017で同じプログラムを試してみましょう。
前回と同じようにして「hello2」プロジェクトを作成し、「hello2.cpp」を次のような内容にします。
#include "stdafx.h"
int main()
{
printf("こんにちは世界\n");
fflush(stdout);
getchar();
return 0;
}
そしてビルド。日本語VSの文字コードは、通常Shift_JISであり、VSは、Bashではなく通常のコマンドプロンプトを使います。 コマンドプロンプトの文字コードは、規定値のShift_JISなので文字コードが一致し、文字化けしません。
文字セットが違うと、テキストデータの解釈と表現方法が違います。SJISで保存した場合と、UTF-8で保存した場合で BZで開いて確認してみて下さい。
まとめ:日本語の場合、文字コードを合わせないと、文字化けする(それだけかい!)。