6日でできる 新C言語入門|Visual StudioでC言語を実行すると文字化けする場合

日本語が読めない文字に変わる原因は、文字コードのすれ違い。
Visual Studioとコンソールの文字コードをそろえて、C言語の日本語表示を正しく扱えるようになろう。

Visual StudioでC言語のプログラムを実行したとき、printfで表示した日本語が読めない文字になってしまうことがあります。

たとえば、ソースコードには次のように書いているとします。

printf("こんにちは\n");

ところが、実行画面では意味の分からない記号のように表示されることがあります。これが、いわゆる文字化けです。

文字化けは、printfが間違っているから起こるわけではありません。多くの場合、ソースファイルを保存している文字コードと、実行画面で表示するときの文字コードが合っていないことが原因です。

C言語では、文字列をそのまま画面に表示する場面がよくあります。英数字だけなら問題が出にくいのですが、日本語を表示する場合は、保存時の文字コードとコンソール側の表示設定の影響を受けやすくなります。

特にVisual StudioでC言語を学習していると、ソースファイルがUTF-8で保存されている一方で、Windowsのコンソール側がShift-JIS系の表示として扱おうとすることがあります。このように、保存側と表示側の文字コードがずれると、日本語が正しく読めなくなります。

この記事では、Visual StudioでC言語を実行したときに日本語が文字化けする原因、UTF-8とShift-JIS系の違い、ソースファイルの文字コードを変更する方法、コンソール側で確認したいポイントまで、初心者向けにやさしく解説していきます。

文字化けは文字コードの不一致で起こりやすい

文字化けを理解するには、まず文字コードの考え方を知っておく必要があります。

コンピュータの中では、文字はそのままの形で保存されているわけではありません。文字ごとに決められた数値として保存されています。この文字と数値の対応ルールを文字コードと呼びます。

日本語を扱うときによく出てくる文字コードには、UTF-8やShift-JIS系があります。

種類特徴
UTF-8現在よく使われる文字コード。Webや多くの開発環境で広く使われる
Shift-JIS系日本語Windows環境で昔から使われてきた文字コード
コードページWindowsのコンソールなどで文字表示に使われる設定

文字化けは、ある文字コードで保存されたデータを、別の文字コードとして読もうとしたときに起こりやすくなります。

たとえば、ソースファイルの日本語がUTF-8で保存されているのに、コンソールがShift-JIS系として表示しようとすると、日本語のバイト列を別の意味として解釈してしまいます。その結果、読めない文字や記号のような表示になります。

Visual Studioとコンソールで文字コードがずれることがある

Visual Studioのエディターで見えている日本語が正しくても、実行画面で正しく表示されるとは限りません。

これは、ソースコードを編集する画面と、プログラムを実行して表示するコンソール画面が、別々の仕組みで文字を扱っているためです。

場所役割
Visual Studioのエディターソースファイルを編集し、保存する
ソースファイル日本語文字列を特定の文字コードで保存する
コンパイラソースコードをビルドする
コンソール画面実行結果の文字を表示する

Visual Studioのエディターでは正しく見えていても、実行画面側のコードページが合っていないと、printfで表示した日本語が文字化けすることがあります。

つまり、文字化けの原因を考えるときは、ソースファイル側だけでなく、コンソール側の表示設定も確認する必要があります。

図:文字化けは保存側と表示側の文字コードが違うと起こりやすい

この図から分かること

この図から分かるのは、文字化けがソースコードそのものの文法ミスではなく、文字コードの解釈違いで起こりやすいということです。

Visual StudioでソースファイルがUTF-8として保存されていても、コンソール画面がShift-JIS系として日本語を表示しようとすると、同じ日本語でも正しく表示できない場合があります。日本語が読めない文字になるときは、保存側と表示側の文字コードがそろっているかを確認することが大切です。

よくある原因はソースファイルがUTF-8で保存されていること

最近の開発環境では、ソースファイルをUTF-8で保存することが多くなっています。UTF-8は多くの環境で使いやすく、英語や日本語など、さまざまな文字を扱える文字コードです。

Visual Studioでも、ファイルの状態や設定によって、ソースファイルがUTF-8で保存されることがあります。

UTF-8自体が悪いわけではありません。むしろ、現在の開発ではよく使われる文字コードです。

問題になるのは、実行結果を表示するコンソール側が、そのUTF-8の文字列をUTF-8として表示していない場合です。

たとえば、次のような組み合わせでは文字化けが起こりやすくなります。

ソースファイルコンソール側の表示起こりやすい問題
UTF-8UTF-8日本語が正しく表示されやすい
Shift-JIS系Shift-JIS系日本語が正しく表示されやすい
UTF-8Shift-JIS系文字化けしやすい
Shift-JIS系UTF-8文字化けしやすい

つまり、どちらか一方が正しいというよりも、保存側と表示側がそろっていることが大切です。

printfで日本語を直接表示すると影響を受けやすい

C言語では、文字列を表示するときにprintfを使います。

プロジェクト/ファイル名: MojibakeSample/main.c

#include <stdio.h>

int main(void) {
    // 日本語の文字列を表示する
    printf("Visual StudioでC言語を学習しています。\n");
    printf("日本語が正しく表示されるか確認します。\n");

    return 0;
}

このプログラムは、文法としては問題ありません。

しかし、ソースファイルの文字コードとコンソール側の文字コードが合っていない場合、次のように日本語部分だけが文字化けすることがあります。

Visual Studio縺ァC險€隱槭r蟄ヲ鄙偵@縺ヲ縺・∪縺吶€
譌・譛ャ隱槭′豁」縺励¥陦ィ遉コ縺輔l繧九°遒コ隱阪@縺セ縺吶€

このような表示になった場合、まず疑いたいのは文字コードの不一致です。

printf自体が日本語を表示できないわけではありません。保存されている日本語のバイト列を、表示側がどの文字コードとして解釈しているかが重要になります。

英数字だけなら気づきにくい

文字化けは、日本語などのマルチバイト文字を表示したときに気づきやすくなります。

たとえば、次のような英数字だけのプログラムでは、文字コードの違いが表面化しにくいです。

#include <stdio.h>

int main(void) {
    printf("Hello C Language\n");
    return 0;
}

英数字は、多くの文字コードで共通して扱われやすいため、UTF-8とShift-JIS系の違いがあっても問題が見えにくい場合があります。

一方、日本語を含むと、文字コードの違いが表示結果に出やすくなります。

表示内容文字化けの気づきやすさ
Hello問題が見えにくい
12345問題が見えにくい
こんにちは文字化けに気づきやすい
日本語の説明文文字化けに気づきやすい

そのため、Visual StudioでC言語を学習していて、急に日本語だけがおかしく表示される場合は、文字コードの設定を確認するとよいでしょう。

原因を一言でいうと文字コードの解釈違い

Visual StudioでC言語を実行したときの文字化けは、次のように考えると分かりやすいです。

ソースコードに書かれた日本語は、何らかの文字コードで保存されています。
その日本語をprintfで表示するとき、コンソール画面は自分の設定に従って文字を表示します。
この保存時の文字コードと表示時の文字コードが違うと、文字化けが起こります。

代表的な原因は、次の組み合わせです。

項目状態
ソースファイルUTF-8で保存されている
実行画面Shift-JIS系として表示している
結果日本語が文字化けする

この場合、対処方法は大きく分けて2つあります。

方法考え方
ソースファイルをコンソール側に合わせるShift-JIS系で保存する
コンソール側をソースファイルに合わせるUTF-8で表示する設定にする

初心者向けの学習では、まずソースファイルの保存形式を確認し、日本語Windowsのコンソールに合わせた文字コードで保存する方法が分かりやすい場合があります。

Visual Studioで文字コードを確認する

Visual Studioでは、開いているファイルのエンコードを確認したり、別のエンコードで保存したりできます。

画面構成はバージョンや設定によって変わることがありますが、エディター画面の右下にエンコード表示が出る場合があります。

そこからエンコードで保存を選ぶと、現在のファイルを別の文字コードで保存できます。

手順の流れは次のようになります。

手順操作
1文字コードを変更したいCファイルを開く
2エディター右下のエンコード表示を確認する
3エンコードで保存を選ぶ
4保存したい文字コードを選ぶ
5OKを押して保存する

この方法を使うと、main.cなど、現在開いているファイルだけを別の文字コードで保存できます。

図:Visual StudioでCファイルのエンコードを変更する流れ

この図から分かること

この図から分かるのは、Visual Studioでは開いているファイルに対して、保存時の文字コードを選び直せるということです。

文字化けが起きた場合、まずmain.cなどのCファイルを開き、エンコード表示を確認します。必要に応じてエンコードで保存を選び、コンソール表示に合いやすい文字コードで保存し直します。ファイル単位で変更できるため、学習中のサンプルを確認するときにも使いやすい方法です。

方法1:ソースファイルをShift-JIS系で保存する

日本語Windowsのコンソールに合わせる場合、CファイルをShift-JIS系で保存すると文字化けが解消することがあります。

特に、Visual StudioでC言語の基本を学習していて、printfで日本語を表示したい場合には、この方法が分かりやすいことがあります。

手順は次のようになります。

手順内容
1Visual Studioでmain.cを開く
2エディター右下のエンコード表示をクリックする
3エンコードで保存を選ぶ
4日本語 Shift-JIS系のエンコードを選ぶ
5OKを押して保存する
6もう一度ビルドして実行する

この方法では、ソースファイル側をコンソールの表示に合わせます。

ただし、今後UTF-8で統一したいプロジェクトや、複数の環境で共有するプロジェクトでは、Shift-JIS系に固定するよりも、UTF-8で統一する方が管理しやすい場合もあります。

学習用の短いプログラムではShift-JIS系で確認し、実用的な開発ではプロジェクト全体の文字コード方針を決める、と考えるとよいでしょう。

方法2:コンソール側をUTF-8に合わせる

ソースファイルをUTF-8のまま使いたい場合は、コンソール側をUTF-8表示に合わせる方法もあります。

Windowsのコンソールでは、コードページを変更してUTF-8に近い表示設定へ切り替えることがあります。

代表的な確認用コマンドとして、次のようなものがあります。

chcp 65001

65001はUTF-8のコードページです。

この設定を行ったうえでプログラムを実行すると、UTF-8の日本語が正しく表示される場合があります。

ただし、環境やフォント、コンソールの種類、Visual Studioからの実行方法によって結果が変わることがあります。そのため、初心者向けには、まずソースファイルの保存形式を確認する方法から試すと分かりやすいです。

方法3:日本語を含まない表示で原因を切り分ける

文字化けの原因を調べるときは、まず英数字だけの表示を試すと切り分けがしやすくなります。

#include <stdio.h>

int main(void) {
    printf("Hello Visual Studio\n");
    printf("ABC 123\n");

    return 0;
}

このような英数字だけの表示が正しく出る場合、printfそのものや実行環境全体が壊れているわけではない可能性が高いです。

次に、日本語を含めた表示を試します。

#include <stdio.h>

int main(void) {
    printf("日本語の表示テスト\n");

    return 0;
}

英数字は正しく出るのに日本語だけが崩れる場合、文字コードの問題である可能性が高くなります。

確認内容判断の目安
英数字が正しく表示されるprintfや基本的な実行はできている
日本語だけ文字化けする文字コードの不一致を疑う
すべて表示されない別のエラーや実行設定も確認する

このように、表示内容を分けて試すと原因を探しやすくなります。

文字化け対策の考え方

文字化け対策では、どの文字コードに統一するかを決めることが大切です。

主な考え方は次の2つです。

方針内容向いている場面
Shift-JIS系に合わせるソースファイルを日本語Windowsのコンソールに合わせる初心者向けの学習、古い環境との互換
UTF-8に合わせるソースファイルと表示環境をUTF-8でそろえる現代的な開発、複数環境での共有

どちらを選ぶ場合でも、ソースファイルと表示側をそろえることが大切です。

一時的に直したいだけなら、main.cをShift-JIS系で保存し直す方法が簡単なことがあります。
将来的に複数人で開発したり、Gitなどで管理したりする場合は、UTF-8で統一する方が扱いやすいこともあります。

図:文字化け対策は保存側と表示側をそろえることが基本

この図から分かること

この図から分かるのは、文字化け対策の基本が保存側と表示側をそろえることだということです。

UTF-8で保存するなら、コンソール側もUTF-8として表示できるようにします。Shift-JIS系で表示するなら、ソースファイルもShift-JIS系で保存すると文字化けを避けやすくなります。どちらを選ぶかよりも、プロジェクト内で方針を統一することが大切です。

Visual Studioで確認したいポイント

Visual StudioでC言語の日本語表示が文字化けしたときは、次の順番で確認すると整理しやすいです。

Cファイルの保存エンコードを確認する

まず、main.cなどのCファイルがどの文字コードで保存されているかを確認します。

エディター右下のエンコード表示から、エンコードで保存を選び、必要に応じて文字コードを変更します。

日本語を表示している箇所を確認する

printfで日本語を直接表示している箇所を確認します。

printf("日本語の表示テスト\n");

このような文字列が文字化けする場合は、保存時の文字コードと実行画面の文字コードの影響を受けている可能性があります。

コンソール側の表示設定を確認する

コンソール側がどのコードページで表示しているかも確認します。

UTF-8で表示したい場合は、環境によってchcp 65001を使って確認することがあります。

chcp 65001

ただし、Visual Studioから実行した場合の表示環境は、実行方法や設定によって異なることがあります。うまくいかない場合は、ソースファイルの保存エンコードを変更する方法も試してみましょう。

プロジェクト全体で文字コードを統一する

複数のCファイルを使う場合、ファイルごとに文字コードが違うと、さらに混乱しやすくなります。

できれば、プロジェクト内のCファイルは同じ方針で保存しましょう。

確認項目内容
main.cの保存形式UTF-8かShift-JIS系か
日本語文字列の有無printfで日本語を直接表示しているか
コンソールのコードページUTF-8表示かShift-JIS系表示か
プロジェクト全体の統一ファイルごとに文字コードが混ざっていないか

文字化けを防ぐための実用的な考え方

C言語の学習中は、日本語の説明文をprintfで表示することがよくあります。そのため、文字化けが起きると、プログラムが間違っているように感じてしまうかもしれません。

しかし、文字化けの多くは、C言語の文法ではなく、文字コードの問題です。

まずは、次のように考えると落ち着いて確認できます。

状況確認すること
日本語だけ崩れる文字コードの不一致を疑う
英数字は正しく出るprintfや実行自体はできている可能性が高い
ファイルを保存し直すと直る保存エンコードが原因だった可能性がある
コードページ変更で直るコンソール側の表示設定が原因だった可能性がある

学習用の短いプログラムでは、まずmain.cの文字コードを確認し、日本語Windowsのコンソールに合う形式で保存し直す方法が試しやすいです。

一方、将来的に複数ファイルやチーム開発を考える場合は、UTF-8で統一し、実行環境側もUTF-8で表示できるように整える方法が扱いやすくなります。

Visual Studioの文字化けは原因を分けて考えると対処しやすい

Visual StudioでC言語を実行したときに日本語が文字化けする場合、主な原因はソースファイルの文字コードとコンソールの表示文字コードが一致していないことです。

printfで日本語を表示している場合、ソースファイルがUTF-8で保存されていて、コンソールがShift-JIS系として表示しようとすると、文字化けが起こることがあります。

対処方法としては、main.cなどのCファイルをエンコードで保存からShift-JIS系に変更する方法、またはコンソール側をUTF-8表示に合わせる方法があります。

大切なのは、ソースファイル側と表示側を同じ方針にそろえることです。

文字化けが起きたら、まず日本語だけが崩れているのか、英数字もおかしいのかを確認しましょう。次に、Cファイルの保存エンコードと、コンソール側のコードページを確認します。

この流れを理解しておくと、Visual StudioでC言語を学習しているときに日本語が崩れても、原因を落ち着いて切り分けられるようになります。