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

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

ただいまの
回答率

88.59%

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

解決済

回答 5

投稿

  • 評価
  • クリップ 2
  • VIEW 16K+

tarou2

score 12

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

ファイルの文字コードをシフトJISにして、

#include <stdio.h>
int main(){
    printf("あいう\n");
    return 0;
}


のようにすれば、そのまま「あいう」と表示されます。
これは実は、コンパイラがソースがUTF-8で書かれており、処理もUTF-8であるとして処理しているためです。同じエンコーディングのため、変換が起こらず、そのまま処理&出力されるので、ソースをシフトJISで書いておけばそのままシフトJISで出力されます。

ただし、コンパイラがシフトJISコードを認識していないので、

#include <stdio.h>
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です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/20 22:17 編集

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

    あと少し話はそれますが, c言語でなにか作ったりするときはUTF-8で作るのが一般的ですか?

    キャンセル

  • 2018/10/20 22:24

    > どうして-finput-charset=CP932だけを指定するとコンパイル結果はUTF-8に変換されて処理され出力されるのですか?

    -fexec-charset のデフォルト値が utf-8 だからです。

    > ソースコードをシフトJISでかいて, コマンドプロンプトのエンコーディングもシフトJISの時は何も指定しなくても, シフトJISで出力されたから、疑問に思いました。

    コンパイラは、utf-8でソースが書かれていると思って、コンパイル結果もutf-8なので無変換でコンパイルしますので、そうなります。と、回答にも書いたのですが。もう一度回答の前半を読み直してください。

    > c言語でなにか作ったりするときはUTF-8で作るのが一般的ですか?

    WindowsならShift_JISが良いんじゃないですかね。

    キャンセル

  • 2018/10/20 22:36

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こんにちは。

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

気持ちは分かるのですが、残念ながら違います。
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/19 11:49

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/20 10:04

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

    キャンセル

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にしてしまうのはあんまりオススメ出来ない。

#include <windows.h>
#include <stdio.h>

int main()
{
    // コンソールのデフォルトの出力コードページを保存
    UINT prevCP = GetConsoleOutputCP();
    // コードページをUTF-8(65001)に変更
    SetConsoleOutputCP(CP_UTF8);

    // 出力はSetConsoleOutputCPの間で行う
    printf("こんにちは\n");

    // コードページをデフォルトに戻す
    SetConsoleOutputCP(prevCP);

    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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