質問: notepad++を使って書いたc言語のプログラムをgccを使ってコンパイルしました. 文字コードはUTF-8にしました. コンパイルが無事に終わり.exeファイルを実行すると文字化けが起きていました. それでコマンドプロンプトの文字コードをUTF-8に変更し、もう一度コンパイルをして.exeファイルと実行すると、今度は文字化けしませんでした. これから、コンパイラは自動で、コマンドプロンプトの文字コードでプログラムが書かれていると 思ってコンパイルしていると、僕は思っているのですが、この解釈でいいでしょうか? コンパイラの文字コードのルールを教えていただきたいです。 わかりにくい文章ですが、ご教授よろしくお願いします。
回答: ファイルの文字コードをシフトJISにして、 ``` #include int main(){ printf("あいう\n"); return 0; } ``` のようにすれば、そのまま「あいう」と表示されます。 これは実は、コンパイラがソースがUTF-8で書かれており、処理もUTF-8であるとして処理しているためです。同じエンコーディングのため、変換が起こらず、そのまま処理&出力されるので、ソースをシフトJISで書いておけばそのままシフトJISで出力されます。 ただし、コンパイラがシフトJISコードを認識していないので、 ``` #include int main(){ printf("あいう表裏\n"); return 0; } ``` の「表」のようにシフトJISの文字コードに`\`を含んだ文字を使うとコンパイルエラーになったり、期待通りに出力されなかったりします。 コンパイルオプションで、コンパイラに「ソースがシフトJISであること」を教える(`-finput-charset=CP932`)と、期待通りになります。 ``` gcc -finput-charset=CP932 -fexec-charset=CP932 ~~ ``` 処理もシフトJISで行って欲しいので、`-fexec-charset=CP932`も指定します。 `-finput-charset=CP932`だけ書くと、コンパイル結果はUTF-8に変換されて処理され出力されます。 ソースをUTF-8で書いて、オプション無しでコンパイルするとそのままUTF-8で処理&出力するので、シフトJISのコマンドプロンプトだと正しく表示できません。処理をシフトJISで行うオプション(`-fexec-charset=CP932`)を付けると、正しく表示できます。 `-finput-charset=` ソースがどのエンコーディングで書かれているかを指定 `-fexec-charset=` コンパイル時に文字データをこのエンコーディングに変換してオブジェクトに埋め込む どちらも、デフォルトはUTF-8です。