48150


Windows10でVS
codeとMinGWを利用しています。MinGWは「mingw32-base」と「mingw32-gcc-g++」をインストールして、バージョンは6.3.0です。

hello worldと表示するだけの簡単なプログラムを書き、「gcc
ファイル名.c」として.exeファイルができたのですが、コードで「printf("円\n")」と書きgccでコンパイルした後、VS
codeのターミナルにて「.\a.exe」でファイルを実行するとコードで「円」の部分が「蜀・」として返ってきます。特に設定を変更した覚えはないです。  
files.encodingは既定値のUTF8です。文字コードが原因でしょうか？ご教授いただければ幸いです。


CC BY-SA 4.0
2018-09-05T14:05:18.490
48122
2018-09-07T21:13:10.060
2018-09-07T21:13:10.060
4236
28915
question
windows vscode 文字化け 文字コード mingw
.exeファイルの文字化けに関して


**文字化けの原因：**  
ソースコード`printf("円\n")`が`UTF-8`ですが、Windows(VSCode)ターミナルのデフォルトエンコードは`ShiftJIS`です。

**対策：**  
VSCodeでファイルのエンコードを`ShiftJIS`に変更します。

  1. `UTF-8`をクリック  
[![画像の説明をここに入力](https://i.stack.imgur.com/spkid.gif)](https://i.stack.imgur.com/spkid.gif)

  2. `Save with Encoding`を選択

  3. `Shift JIS`を選択
  4. 再コンパイル


CC BY-SA 4.0
2018-09-06T11:19:25.297
48150
2018-09-06T11:19:25.297
9004
48122
answer


VSCode のターミナルで実行されているコマンドプロンプト (cmd.exe) は、設定によってデフォルトの文字コードが Shift_JIS (正確には
[CP932](https://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932))
になっています。ソースコードの文字コードが UTF-8 だと、この違いが原因で文字化けすることがあります。

たとえば適当なアップデートを適用した Windows 10 の場合、cmd.exe の文字コードを UTF-8 に変更するコマンド

[code]

    chcp 65001
    
[/code]

を実行したあと `a.exe` を実行して文字化けが直るのであれば、文字コードの差が原因です。なお、Shift_JIS には

[code]

    chcp 932
    
[/code]

で戻すことができます。

現代的には Unicode に揃えるのが良いでしょうから、cmd.exe のデフォルト文字コードを UTF-8 にしてしまいましょう。上記の `chcp
65001` は cmd.exe を起動するたびに打ち直さないといけないので、`cmd.exe` を起動した際に自動的に `chcp 65001`
するようなオプション付きで起動させるようにしてみます。これは cmd.exe の `/K` オプションでできるのですが、VSCode
の場合デフォルト・シェルの設定をすることでオプションを追加することができます。

ファイル→基本設定→設定

[code]

    "terminal.integrated.shell.windows": "C:\\Windows\\system32\\cmd.exe",
    "terminal.integrated.shellArgs.windows": [
            "/K",
            "chcp",
            "65001"
        ]
    
[/code]

参考: [VSCodeのcmdをUTF-8で使う](https://qiita.com/te2ji/items/873e1bb42ef9b3a52c1d)
-- Qiita


CC BY-SA 4.0
2018-09-07T14:14:39.037
48193
2018-09-07T14:14:39.037
19110
48122
answer


WindowsにはWide（常にUTF-16）とANSI（設定により変更可能、日本語ではShift-
JISのみ）の２種類の世界が存在します。それぞれについて説明します。他の方の回答はいずれも不完全なので補足します。また実行手段として質問のVSCode上のTerminalの他にコマンドプロンプトについても説明します。

* * *

## WideでUTF-16を扱う方法

ソースコードはUTF-8を使用します。`printf`でなく[`wprintf`](https://ja.cppreference.com/w/c/io/fwprintf)を使用します。更に文字列はWide文字列を使用する必要があります。これによりコンパイル時にUTF-8からWide文字に変換されます。またWindows版`wprintf`の仕様として[`setlocale`](https://ja.cppreference.com/w/c/locale/setlocale)
or `_wsetlocale`によるロケール設定の必要があります。これにより実行時にWide文字が指定のロケールで解釈されます。

[code]

    #include <locale.h>
    #include <stdio.h>
    
    int main() {
        _wsetlocale(LC_ALL, L"");
        wprintf(L"円\n");
    }
    
[/code]

実行方法については特別な操作は必要ありません。

* * *

## ANSIでUTF-8を扱う方法

nekketsuuuさんの回答です。ソースコードはUTF-8を使用します。`printf`がUTF-8を出力していることを出力先に伝える必要があります。その方法は事前に`chcp
65001`コマンドを実行するか、プログラム内で[`SetConsoleOutputCP`](https://docs.microsoft.com/en-
us/windows/console/setconsoleoutputcp)を実行するか、どちらでも実現できます。なお、[Windows版`setlocale`
or `_wsetlocale`はUTF-8に対応していない](https://docs.microsoft.com/en-
us/cpp/c-runtime-library/reference/setlocale-
wsetlocale?view=vs-2017)ため使用できません。

[code]

    #include <stdio.h>
    #include <Windows.h>
    
    int main() {
        SetConsoleOutputCP(CP_UTF8);  // CP_UTF8 = 65001
        printf("円\n");
    }
    
[/code]

実行方法としては先に説明した通り、プログラム内で`SetConsoleOutputCP`を実行しない場合は事前に`chcp
65001`コマンドを実行します。  
VSCode上のTerminalではそのまま実行できますが、コマンドプロンプトは正しくフォントを設定しないとフォント化けします。具体的には`cmd.exe`を実行するショートカットを作成し、そのショートカットのプロパティ内でフォントとして`ＭＳ
ゴシック`を選択する必要があります（コマンドプロンプト左上のコントロールメニュー内の`既定値`や`プロパティ`からでは正しく設定できない）。

* * *

## ANSIでShift-JISを扱う方法

Jiuさんの回答です。ソースコードはShift-JISを使用します。なお、[Shift-
JISは`表`など２バイト名が`\`と同じコードとなる文字が存在](https://ja.wikipedia.org/wiki/Shift_JIS#2%E3%83%90%E3%82%A4%E3%83%88%E7%9B%AE%E3%81%8C5C%E7%AD%89%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%86%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%82%88%E3%82%8B%E5%95%8F%E9%A1%8C)します。そのままではC++言語上で`\`と解釈され構文エラーや文字化け等を引き起こします。g++に対してコンパイルオプション`-finput-
charset=CP932 -fexec-charset=CP932`でShift-JISソースコードを扱っていることを伝える必要があります。

[code]

    #include <stdio.h>
    
    int main() {
        printf("円\n");
    }
    
[/code]

実行方法については特別な操作は必要ありません。が、前述のパターンでコードページを`65001`に変更している場合は、`chcp
932`で日本語に戻しておく必要があります。


CC BY-SA 4.0
2018-09-07T21:05:17.523
48197
2018-09-07T21:05:17.523
4236
48122
answer