質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

5回答

41582閲覧

c言語のプログラムをコンパイルするときの、文字コードルールがわかりません。

tarou2

総合スコア28

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

1グッド

2クリップ

投稿2018/10/16 09:11

notepad++を使って書いたc言語のプログラムをgccを使ってコンパイルしました.
文字コードはUTF-8にしました. コンパイルが無事に終わり.exeファイルを実行すると文字化けが起きていました. それでコマンドプロンプトの文字コードをUTF-8に変更し、もう一度コンパイルをして.exeファイルと実行すると、今度は文字化けしませんでした.

これから、コンパイラは自動で、コマンドプロンプトの文字コードでプログラムが書かれていると
思ってコンパイルしていると、僕は思っているのですが、この解釈でいいでしょうか?
コンパイラの文字コードのルールを教えていただきたいです。

わかりにくい文章ですが、ご教授よろしくお願いします。

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

otn

総合スコア85766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarou2

2018/10/20 13:19 編集

下から7行目のところですが, どうして-finput-charset=CP932だけを指定するとコンパイル結果はUTF-8に変換されて処理され出力されるのですか? ソースコードをシフトJISでかいて, コマンドプロンプトのエンコーディングもシフトJISの時は何も指定しなくても, シフトJISで出力されたから、疑問に思いました。 よろしくお願いします。 あと少し話はそれますが, c言語でなにか作ったりするときはUTF-8で作るのが一般的ですか?
otn

2018/10/20 13:24

> どうして-finput-charset=CP932だけを指定するとコンパイル結果はUTF-8に変換されて処理され出力されるのですか? -fexec-charset のデフォルト値が utf-8 だからです。 > ソースコードをシフトJISでかいて, コマンドプロンプトのエンコーディングもシフトJISの時は何も指定しなくても, シフトJISで出力されたから、疑問に思いました。 コンパイラは、utf-8でソースが書かれていると思って、コンパイル結果もutf-8なので無変換でコンパイルしますので、そうなります。と、回答にも書いたのですが。もう一度回答の前半を読み直してください。 > c言語でなにか作ったりするときはUTF-8で作るのが一般的ですか? WindowsならShift_JISが良いんじゃないですかね。
tarou2

2018/10/20 13:36

わかりました! ご丁寧にありがとうございました!
guest

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

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarou2

2018/10/19 02:49

コンパイルオプションがあるとは知りませんでした。コンパイラと文字コードに ついての知識が増えました。ありがとうございました!!
guest

0

gccはコンパイルオプションで制御できます。
こちらのページを参考にしてみてください。

MinGWでSJISのソースコードをオプション無しでコンパイルしたら、文字化けしなかった…。
もう少し調査が必要かもしれませんが、基本的にはリンク先の通りです。

投稿2018/10/16 10:28

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語では文字コードは考慮してません
UTF8で書いたら、そのままUTF8で出力されます。

コマンドプロンプトはデフォルトではShiftJISなので、そっちの方を変更しないといけません。
「コマンドプロンプト UTF8」でぐぐってみてください

投稿2018/10/16 09:16

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarou2

2018/10/20 01:04

わかりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問