文字コード

文字を表示する仕組み

C言語では文字はchar型で扱います。
char型は文字型ですが内部的には1バイト整数の情報を持ちます。
(signed char型で-128~127、unsigned char型で0~255)

コンピューターで文字を表示する場合、あらかじめ文字毎に番号を割り振っておき、どの文字を表示するかを番号で指定します。
例えば「アルファベットのAは65番」「Bは66番」...と定義しておき、プログラムから「65番目の文字を表示せよ」という指令を出せば「A」が表示される、といった具合です。

どのような文字をサポートし、それぞれの文字に何番を割り振るかを定義したものを文字コードといいます。

サポートする文字の種類を文字集合、番号の割り振り方を符号化方式といいます。
文字コードという言葉はこの両方を含める場合もあれば、文字集合のみ、符号化方式のみを指して文字コードと呼ぶ場合もあります。
(厳密に使い分けられていない場合もあります)

文字コードは結構種類があるのですが、日本語環境で知っておくべきものは「ASCII」「Shift_JIS」「EUC-JP」「UTF-8」「UTF-16」あたりです。

ASCIIは英数字や基本的な半角の記号を扱います。
これだけでは日本語は表現できません。
すべての文字を1バイトで扱えます。
改行やタブ文字などの制御文字もこれに含まれています。
C言語で使用する演算子はすべてASCIIの範囲の文字です。

Shift_JISはWindows環境に多く、EUC-JPはUNIX(Linux、Mac)環境に多いです。
どちらも日本語を扱えます。
ASCIIの範囲の文字はASCIIと共通の符号化方式を使用しているため、半角の英数字記号だけを使用する場合はASCIIと互換性があります。

「UTF-○○」は「Unicode」という文字集合に対する符号化方式です。
Unicodeは扱える文字種が非常に多いのが特徴です。

「UTF-○○」が示す数字は「文字ひとつを最小何ビットで表すか」を表し、例えばUTF-8ならば8ビット(1バイト)が最小のサイズとなります。
あくまでも「最小のサイズ」であり、8ビット固定ではありません。
UTF-8は文字によって1~4バイトを使用します。
(ただしUTF-32は32ビットで固定です)
UTF-8のみ、半角英数字記号はASCIIと互換性があります。

UTF-8は扱える文字種が非常に多く、ASCIIとも一部互換性があり、UTF-16や32よりもファイルサイズが抑えられるという特徴があります。
日本語を扱う場合はShift_JISやEUC-JPの方がサイズを抑えられるのですが、今時はデータサイズはそこまで重要視されていないので、WindowsでもLinuxでも広く使用されています。

Windows環境では文字コードに「Unicode」という名称が使われることがありますが、これはUTF-16(LE)のことです。

C言語での文字コード

C言語で使用する文字コードは決められておらず、環境(コンパイラ)に依存します。

Windows(日本語) + VisualStudioならばデフォルトでShift_JISが使用されます。
最近のLinux環境ならおそらくUTF-8が多いでしょう。

自作プログラムだけで完結する場合は文字コードはあまり気にする必要はありませんが、文字コードによって日本語一文字あたりのバイト数が異なることは知っておく必要があります。
他のプログラムと連携する場合、例えば他のプログラムが生成したファイルを読み込んで処理する場合は特に文字コードの違いに気を付ける必要があります。

VisualStudioのソースの文字コードをUTF-8にする

上述の通りWindows環境のVisualStudioのソースコードは既定でShift_JISが使用されます。
そのままでも特に問題はありませんが、他の開発環境と合わせたい場合など、UTF-8のほうが都合が良い場合もあります。
その場合は以下の手順でソースコードの文字コードをUTF-8に変更できます。

「ファイル」メニューから「保存オプションの詳細設定」を選択します。
VisualStudioのソースコードの文字コードの変更1

VisualStudio2017では「名前を付けて(ソースコード名)を保存」メニューで開く保存ダイアログに「エンコード付きで保存」というメニューがありますので、そちらを選択します。

開いたダイアログから「Unicode(UTF-8 シグネチャ付き) - コードページ65001」を選択します。
VisualStudioのソースコードの文字コードの変更1

これで現在のソースコードがUTF-8で保存されます。

BOMなしのUTF-8の場合

上記の方法でソースコードを保存すると「UTF-8 BOM付き」という形式で保存されます。
BOMというのは「Byte Order Mark」の略で、テキストファイルの先頭に付加される数バイトのデータのことです。
これには「符号化方式」「ビット表現の方式(ビッグエンディアン、リトルエンディアン)」といった情報が保存されています。

BOM付きのUTF-8の場合はVisualStudioでそのまま読み込むだけでUTF-8として扱ってくれます。

他の環境やテキストエディタなどで作成したソースコードの場合、同じUTF-8でも「BOMなし」で保存されることがあります。
このソースコードをそのままVisualStudioに読み込むと上手くUTF-8として認識してくれず、コンパイルできません。

ソースコードをBOMありで保存しなおすか、VisualStudioで生成したソースコードにコピペで貼り付けても良いですが、数が多いと大変なのでコンパイルオプションでUTF-8と認識させる方法もあります。

上部の「プロジェクト」→「(プロジェクト名)のプロパティ」を開き、左のメニューから「構成プロパティ」→「C/C++」→「コマンドライン」の項目を選択します。

下部の「追加のオプション」の欄に「/utf-8」または「/source-charset:utf-8」と入力してOKを押下します。
VisualStudioのソースコードの文字コードの変更3

これで現在のソースコードをUTF-8としてコンパイルするようになります。

Releaseビルドに変更した場合も同じようにコマンドラインに追加してください。

このコンパイルオプションを設定した状態でソースコードにShift_JISを使用すると、コンパイルは可能ですが色々とおかしなことになる可能性が高いので、必ずソースコードもUTF-8を使用するようにしてください。