C言語 | 高度な機能 | ワイド文字 - wprintf(), wscanf(), setlocale()

ワイド文字は、1バイト文字では扱いにくい文字集合をC言語で処理するときに使います。国際化されたソフトウェアを開発するときに役立ちます。

国際化対応

char は1バイトです。ASCIIには十分ですが、韓国語のような言語で使われるすべての文字を直接表すことはできません。C言語ではワイド文字用に wchar_t 型を提供しています。ワイド文字とワイド文字列のリテラルには L を付けます。

wchar_t wc = L'개';
wchar_t wstr[] = L"당신의 무릎에 개";

ワイド文字列は通常の char 文字列とは異なります。たとえば strlen() などのナロー文字列用関数ではなく、ワイド文字列用関数を使います。

コード1

#include <stdio.h>
#include <stddef.h>

int main() {
  wchar_t wc = L'개';
  printf("wchar_t size = %zu\n", sizeof wc);
  return 0;
}

このプログラムは wchar_t 値のサイズを表示します。実際のサイズは処理系によって異なります。

ワイド文字列を入出力するときは wprintf()wscanf() などのワイド文字用関数を使います。

wprintf()関数

int wprintf(const wchar_t *format, ...);

wscanf()関数

int wscanf(const wchar_t *format, ...);

ロケール依存のテキストを正しく扱うには、locale.hsetlocale() でロケールを設定します。

setlocale()関数

char *setlocale(int category, const char *locale);

category には変更するロケール情報の種類を指定します。locale には対象のロケールを指定します。成功するとロケールを表す文字列へのポインタを返し、失敗すると設定を変更せず NULL を返します。

表1 - ロケールカテゴリを表す定数

定数 意味
LC_ALL すべてのカテゴリ
LC_COLLATE 文字列の照合
LC_CTYPE 文字の処理
LC_MONETARY 通貨の書式情報
LC_NUMERIC 数値の書式情報
LC_TIME 日付と時刻の書式

利用できるロケール名は実行環境によって異なります。空文字列を渡すと環境のネイティブロケールが選択されます。堅牢なプログラムでは setlocale() の戻り値を確認してください。

コード2

#include <stdio.h>
#include <stddef.h>
#include <locale.h>
#include <wchar.h>

int main() {
  wchar_t wcat = L'개';
  wchar_t *wstr = L"당신의 무릎에";

  setlocale(LC_ALL, "");
  wprintf(L"%ls%lc\n", wstr, wcat);
  return 0;
}

このプログラムは実行環境のロケールを選択し、ワイド文字列とワイド文字を表示します。必要なロケールが実行環境でサポートされていない場合、設定は失敗します。