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

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

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

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

Q&A

解決済

2回答

5089閲覧

Visual studio codeでターミナルに出力させたところ、文字化けが起こってしまいました。

jack_kanzaki

総合スコア106

C

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

0グッド

1クリップ

投稿2019/06/16 08:21

ターミナルに時刻を表示させようと思い、下記のコードを入力しました。

#include <stdio.h> #include <time.h> int main(void){ time_t timer; struct tm *t_st; time(&timer); printf("現在時刻:%s\n",ctime(&timer)); t_st = localtime(&timer); printf("月: %d\n", t_st->tm_mon+1); printf("月: %d\n", t_st->tm_mday); printf("月: %d\n", t_st->tm_hour); printf("月: %d\n", t_st->tm_min); printf("月: %d\n", t_st->tm_sec); return 0; }

コンパイルした後の出力結果は下記の通りです。
日本語表示させようと思ったのですが、文字化けしてしまいました。
調べたところ、UTF-8日本語の文字コードに関係しているということまではわかり、
Visual Studio Codeの設定から、User,Workspaceにおいて、Auto Guess Encodingでチェックをいれたのですが、
以前として文字化けが起こってしまうので、
質問しました。
よろしくお願いします。

ーーターミナルーー

PS C:\vscode> ./timef.exe
迴セ蝨ィ譎ょ綾・售un Jun 16 16:44:53 201919

譛茨シ壹6
譛茨シ壹16
譛茨シ壹16
譛茨シ壹44
譛茨シ壹53

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

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

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

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

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

guest

回答2

0

ベストアンサー

Auto Guess Encodingでチェックをいれたのですが、

これはソースコード(編集中)の文字コード指定に関するものなので、あまり関係無いですね。
問題点は明確で、実行しているターミナルの文字コードが Shift-JISであるが、実行プログラムが、UTF-8で出力しているから、ですね。
従って、ソースも Shift-JISとすれば、問題は無いと思うのですが、それは求める解決法では無いと思い、調べたのですが、手元では失敗。(別の設定変更が原因か?)
参考としたリンクを置きます。

-VSCode デバッグで日本語の文字化けを回避する方法
-VSCodeのcmdをUTF-8で使う (こちらのte2jiさんの書いたもの?)
-Visual Studio Codeのターミナルの文字化けの回避方法

投稿2019/06/16 11:50

pepperleaf

総合スコア6383

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

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

jack_kanzaki

2019/06/19 07:22

二つ目の引用"VScodeのcmdをUTF-8で使う"にある設定変更において、ファイル→基本設定→ワークスペース設定という箇所があったのてすが、ワークスペース設定のところで、コードの入力ができなくなっているのですか、どのようにしたらよろしいでしょうか。拙い説明ですみません。
pepperleaf

2019/06/19 15:02 編集

最近の VSCodeだと設定が変わってますね。 "ファイル" - "基本設定" - "設定" とすると、「設定」画面が出ます。 その時、右上 (_□× の下あたり) に "{}" があるので、そこをクリックすると、該当の設定画面になります。("ユーザー"のままで良いと思います) この時、画面分割されて、左側が標準の設定。右側を変更する。
jack_kanzaki

2019/06/19 16:02

教えていただいた、設定の仕方と Visual Studio Codeのターミナルの文字化けの回避方法、というURLの通りに操作するとうまく行きました。どうもありがとうございます。
guest

0

Windowsのコマンドプロンプトだとそれ専用の入出力APIとかが用意されているので、
windows.hをインクルードしてSetConsoleOutputCPでコマンドプロンプトのコードページを変更するのが簡単かなと思います。
Windows 10以前の古いバージョンでも上手くいくかはわかりませんが

c

1#include <stdio.h> 2#include <time.h> 3 4#include <windows.h> 5 6int main(void) 7{ 8 9 time_t timer; 10 struct tm *t_st; 11 12 // コマンドプロンプトのコードページを保存 13 UINT prevCP = GetConsoleOutputCP(); 14 // コードページをUTF-8に変更 15 SetConsoleOutputCP(CP_UTF8); 16 17 time(&timer); 18 19 printf("現在時刻:%s\n", ctime(&timer)); 20 21 t_st = localtime(&timer); 22 printf("月: %d\n", t_st->tm_mon + 1); 23 printf("月: %d\n", t_st->tm_mday); 24 printf("月: %d\n", t_st->tm_hour); 25 printf("月: %d\n", t_st->tm_min); 26 printf("月: %d\n", t_st->tm_sec); 27 28 // コードページを元に戻す(これをやらないとコマンドプロンプトを開き直すまでUTF-8のままになる) 29 SetConsoleOutputCP(prevCP); 30 31 return 0; 32}

追記

おそらくgccを使用していると思いますが、
Windows APIを使わず、コマンドラインオプションを指定して解決する方法もあるみたいなので
こちらの質問の解答も参照してみて下さい。

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


gcc -fexec-charset=CP932 timef.cはうまくいきませんでしたか?
あと、コマンドプロンプトでchcp 65001を実行して文字コードを変えてしまうという対処法をよく見かけますが、これをやるくらいならUTF-8は諦めて素直にソースコードをShift-JISで保存し直した方が良いと個人的には思いますね。

exec-charset

投稿2019/06/16 10:52

編集2019/06/19 09:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jack_kanzaki

2019/06/19 08:12

VS Codeで試してみたのですが、 ターミナルでは PS C:\vscode> ./timef.exe 迴セ蝨ィ譎ょ綾・啗ed Jun 19 17:08:02 2019 譛茨シ壹6 譛茨シ壹19 譛茨シ壹17 譛茨シ壹8 譛茨シ壹2 依然として、このように文字化けしてしまいました。
jack_kanzaki

2019/06/19 08:13

他にも対処方法がございましたら、ご教授いただければ幸いです。
pepperleaf

2019/06/19 15:04

コンソールで実行するだけなら、 > PS C:\vscode> ./timef.exe  の前に、 > chcp 65001 [enter] するだけで良い筈です。 (文字コードを UTF-8 にする)
jack_kanzaki

2019/06/19 15:43

gcc -fexec-charset=CP932 timef.cのコードはうまく行きませんでした。 コンソールで実行するだけなら、 > PS C:\vscode> ./timef.exe  の前に、 > chcp 65001 [enter] するだけで良い筈です。 (文字コードを UTF-8 にする) はうまく行きました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/06/19 15:59

> gcc -fexec-charset=CP932 timef.cのコードはうまく行きませんでした。 なんだろう?gccのバージョンが古いのかな? というかgccですよね? 質問をする時は環境を正確に書いたほうが良いですよ。 あと、以下の様なオプションもあるのでこちらも試しにやってみて下さい。 --input-charset=UTF-8の方はソースコードがUTF-8なら省けるそうです。 gcc timef.c --input-charset=UTF-8 --exec-charset=cp932 > chcp 65001 まあ今回は使い捨てのコードっぽいのでそれでも構わないかもしれませんが、あくまでその場しのぎの対処法的やり方なので実際に何か作って配布したりには向かないということだけは留意しておいて下さい。
jack_kanzaki

2019/06/19 16:07

なんだろう?gccのバージョンが古いのかな? というかgccですよね? 質問をする時は環境を正確に書いたほうが良いですよ。 ー>はい、gccを使っています。 あと、以下の様なオプションもあるのでこちらも試しにやってみて下さい。 --input-charset=UTF-8の方はソースコードがUTF-8なら省けるそうです。 gcc timef.c --input-charset=UTF-8 --exec-charset=cp932 ー>うまく行きました。ありがとうございます。 まあ今回は使い捨てのコードっぽいのでそれでも構わないかもしれませんが、あくまでその場しのぎの対処法的やり方なので実際に何か作って配布したりには向かないということだけは留意しておいて下さい。 ー>了解しました。 一つ一つ丁寧に、ご教授いただき、ありがとうございました。
jack_kanzaki

2019/06/19 16:08

今後ともよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問