C++入門|Visual StudioでC言語の文字化けを直す方法

日本語が読めないのは、技が失敗したからじゃない。文字コードのすれ違いを整えて、Visual Studioの修行場で日本語表示をしっかり成功させよう。

Visual StudioでC言語の学習をしていると、プログラムはちゃんと動いているのに、日本語だけが読めない記号のように表示されてしまうことがあります。
こんにちは と表示したいのに、謎の文字列になってしまうと、最初は printf の書き方を間違えたのかな、と不安になりますよね。

でも、こうした文字化けは、C言語の文法ミスが原因とは限りません。むしろ多くの場合は、ソースファイルを保存した文字コード と、実行結果を表示するコンソール側の文字コード が食い違っていることが原因です。

ドラゴンボール風にたとえるなら、戦士が修行の指示を正しく書いた巻物を渡しているのに、受け取る修行装置のほうが別の流派の合図として読み取ってしまっている状態です。
書いた内容が悪いわけではなく、読み取り方がずれている ために、意味の通らない表示になってしまうのです。

ここでは、Visual StudioでC言語を実行したときに日本語が文字化けする原因、UTF-8とShift-JIS系の違い、Visual Studioで文字コードを確認して保存し直す方法、コンソール側で確認したいポイントまで、やさしく整理していきます。

文字化けは、文字コードのすれ違いで起こりやすい

まず最初に知っておきたいのは、コンピュータの中では文字がそのままの形で保存されているわけではない、ということです。

文字は内部では数値として管理されています。
そして、どの文字をどの数値で表すかを決めているルールが、文字コード です。

ドラゴンボール風に言えば、文字コードは流派ごとの合図表のようなものです。
同じ こんにちは というメッセージでも、亀仙流の合図表で書いたものを、別の流派の読み方で解釈すると、まったく違う意味不明な信号になってしまいます。

日本語を扱うときによく出てくる文字コードは、主に次のようなものです。

種類特徴ドラゴンボール風のたとえ
UTF-8現在広く使われる文字コード。Webや多くの開発環境で使われやすい多くの星で通じやすい共通の修行言語
Shift-JIS系日本語Windows環境で長く使われてきた文字コード地球の修行場で昔から使われる伝統の合図
コードページWindowsのコンソールなどで文字表示に使われる設定修行装置が今どの合図表で受け取るかの設定

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

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

Visual Studioの画面で正しく見えても、実行結果で崩れることがある

Visual Studioのエディターで日本語がきれいに見えていると、安心してしまいがちです。
でも、編集画面で正しく見えることと、実行画面で正しく表示されることは、必ずしも同じではありません。

なぜなら、ソースコードを編集する場所と、実行結果を表示するコンソール画面は、別々の仕組みで文字を扱っているからです。

場所役割ドラゴンボール風のイメージ
Visual Studioのエディターソースファイルを編集し、保存する戦士が巻物に技名や指示を書く場所
ソースファイル日本語文字列を特定の文字コードで保存する技の指示が記録された巻物そのもの
コンパイラソースコードをビルドする修行装置で技を実戦用に変換する工程
コンソール画面実行結果の文字を表示する修行装置の表示パネル

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

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

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

この図が示していること

この図が示しているのは、文字化けがプログラムの文法ミスではなく、保存側と表示側の文字コードの食い違い で起こりやすいということです。

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

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

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

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

ここで大事なのは、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 を使います。
日本語の文字化けは、まさにこの 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 ではなく、文字コードの不一致 です。

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

英数字だけなら、問題が表面化しにくい

文字化けがやっかいなのは、英数字だけでは異常に気づきにくいことです。

たとえば、次のようなプログラムは、文字コードがずれていても問題が見えにくいことがあります。

#include <stdio.h>

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

英数字は多くの文字コードで似たように扱われやすいため、UTF-8 と Shift-JIS系 の違いがあっても、見た目では気づきにくいことがあります。

一方、日本語を含むと違いがはっきり出やすくなります。

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

ドラゴンボール風にたとえるなら、英数字はどの流派でもだいたい通じやすい基本の合図です。
でも日本語は、流派ごとの細かい型の違いが出やすく、合図表のズレが表面化しやすいわけです。

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

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

  1. ソースコードに書かれた日本語は、何らかの文字コードで保存される
  2. printf で表示するとき、コンソール画面は自分の表示ルールに従って文字を出す
  3. この 保存時の文字コード表示時の文字コード が違うと、文字化けが起こる

代表的な組み合わせは次のとおりです。

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

この場合の対処法は、大きく分けると次の2つです。

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

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

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

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

画面構成はバージョンや設定によって少し変わることがありますが、エディター画面の右下にエンコード表示が出る場合があります。
そこから、エンコードで保存 を選ぶことで、現在のファイルを別の文字コードで保存し直せます。

流れを表にすると、次のようになります。

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

この方法を使うと、main.c など、今開いているファイルだけを対象にして文字コードを変更できます。

Shift-JISで保存する方法

コードエディターの右下の「文字コード」の表示をクリックします。

エンコードに「日本語(シフトJIS) - コードページ 932」を選択して「OK」をクリックします。

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

この図が示していること

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

文字化けが起きたら、まず 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 で統一するほうが管理しやすいこともあります。

方法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

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

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

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

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

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

この流れが分かっていると、Visual StudioでC言語を学習しているときに日本語が崩れても、あわてずに原因を切り分けられるようになります。
修行中に技名が変な表示になっても、技が壊れたわけではありません。まずは、巻物の書き方と修行装置の読み取り方がそろっているか を確認していけば大丈夫です。