notepad++を使って書いたc言語のプログラムをgccを使ってコンパイルしました.
文字コードはUTF-8にしました. コンパイルが無事に終わり.exeファイルを実行すると文字化けが起きていました. それでコマンドプロンプトの文字コードをUTF-8に変更し、もう一度コンパイルをして.exeファイルと実行すると、今度は文字化けしませんでした.
これから、コンパイラは自動で、コマンドプロンプトの文字コードでプログラムが書かれていると
思ってコンパイルしていると、僕は思っているのですが、この解釈でいいでしょうか?
コンパイラの文字コードのルールを教えていただきたいです。
わかりにくい文章ですが、ご教授よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
ファイルの文字コードをシフトJISにして、
C
1#include <stdio.h> 2int main(){ 3 printf("あいう\n"); 4 return 0; 5}
のようにすれば、そのまま「あいう」と表示されます。
これは実は、コンパイラがソースがUTF-8で書かれており、処理もUTF-8であるとして処理しているためです。同じエンコーディングのため、変換が起こらず、そのまま処理&出力されるので、ソースをシフトJISで書いておけばそのままシフトJISで出力されます。
ただし、コンパイラがシフトJISコードを認識していないので、
C
1#include <stdio.h> 2int main(){ 3 printf("あいう表裏\n"); 4 return 0; 5}
の「表」のようにシフトJISの文字コードに\
を含んだ文字を使うとコンパイルエラーになったり、期待通りに出力されなかったりします。
コンパイルオプションで、コンパイラに「ソースがシフトJISであること」を教える(-finput-charset=CP932
)と、期待通りになります。
CMD
1gcc -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です。
投稿2018/10/16 12:56
総合スコア85766
0
こんにちは。
これから、コンパイラは自動で、コマンドプロンプトの文字コードでプログラムが書かれていると
思ってコンパイルしていると、僕は思っているのですが、この解釈でいいでしょうか?
気持ちは分かるのですが、残念ながら違います。
Windowsは文字コードに関して未だに混乱が続いています。(linuxはUTF-8が事実上の標準に概ねなっている印象です。)
コマンド・プロンプトのデフォルトは、「Windowsメニュー → 設定 → 時刻と言語 → 地域と言語 → 管理用の言語の設定」をクリックして表示されるダイアログの「Unicode対応ではないプログラムの言語」で設定した文字コードになります。「日本語」を選択するとCP932(Shift-JIS)となります。
さて、C言語が取り扱う文字コードはややこしいです。C言語のコア(ライブラルやプリプロセッサを除く部分)は文字列リテラルについて文字コードを気にします。(以下は u8が前置されない文字列リテラルの話です。)
gcc(MinGW含む)は、基本は UTF-8 でソースが書かれていることを期待しています。
コンパイル・オプションで変更することもできます。--input_charset
でソースの文字コード(エディタで指定したコード)を指定し、--exec-charset
でそのリテラルの変換先の文字コードを指定します。
Visual C++は、基本はソースが上記ダイアログで設定した文字コードで書かれていることを期待します。
BOM付きUTF-8ならUTF-8で書かれていることを期待します。そして、どちらのケースでも文字列リテラルは 上記ダイアログで設定した文字コードへ変換されます。
なお、Visual C++も比較的最近公開された execution_character_set プラグマを使えば変換先の文字コードを指定できます。
投稿2018/10/16 16:40
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Visual C++はソースコードの文字コードの種類にかかわらず
UTF-8文字列リテラルが付いているものはUTF-8として
それ以外はShiftJISで処理されていたと思います。
gccは他の方が仰られている通りShiftJISで書けばShiftJISで
UTF-8ならUTF-8としてそのまま処理されます。
で、日本語版のWindowsのコマンドプロンプトはCP932(ShiftJIS)となっています。
なので、gccでCのソースコードをコンパイルする場合はShiftJISで保存するか、
Windows APIを使用してコンソールのコードページを変更してあげる必要があります。
chcp 65001
でコードページをUTF-8にしてしまうのはあんまりオススメ出来ない。
C++
1#include <windows.h> 2#include <stdio.h> 3 4int main() 5{ 6 // コンソールのデフォルトの出力コードページを保存 7 UINT prevCP = GetConsoleOutputCP(); 8 // コードページをUTF-8(65001)に変更 9 SetConsoleOutputCP(CP_UTF8); 10 11 // 出力はSetConsoleOutputCPの間で行う 12 printf("こんにちは\n"); 13 14 // コードページをデフォルトに戻す 15 SetConsoleOutputCP(prevCP); 16 17 return 0; 18} 19
投稿2018/10/16 12:21
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/20 13:19 編集
2018/10/20 13:24
2018/10/20 13:36