#wchar.h

ワイド文字は 1 文字を表すために 2 バイトまたは 4 バイトを使用するため、C 言語の従来の文字処理関数が失敗します。 wchar.h は、多くのワイド文字固有の処理関数を定義します。

型のエイリアスとマクロ

wchar.h は、型エイリアス wint_t を定義します。これは、ワイド文字が整数値に対応することを示します。

wchar.h は、ファイル終端文字 EOF のワイド文字バージョンを表すマクロ WEOF も定義します。

btowc()、wctob()

btowc() はシングルバイト文字をワイド文字に変換し、wctob() はワイド文字をシングルバイト文字に変換します。

wint_t btowc(int c);
int wctob(wint_t c);

btowc() はワイド文字を返します。引数が EOF の場合、または変換が失敗した場合は、WEOF が返されます。

wctob() はシングルバイト文字を返します。パラメータが WEOF の場合、またはパラメータのワイド文字が単一の半角文字に対応できない場合は、EOF が返されます。

以下に使用例を示します。

wint_t wc = btowc('B');

// ワイド文字 B を出力します
wprintf(L"ワイド文字: %lc\n", wc);

unsigned char c = wctob(wc);

// 半角文字Bを出力します
wprintf(L"半角文字:%c\n", c);

fwide()

fwide() は、バイト ストリームがワイド文字ストリームであるかマルチバイト文字ストリームであるかを設定するために使用されます。

ワイド文字特殊関数を使用してバイト ストリームを処理する場合、バイト ストリームはデフォルトでワイド文字ストリームに設定されます。それ以外の場合は、fwide() を使用して明示的に設定する必要があります。

int fwide(FILE* ストリーム、int モード);

2 つのパラメータを受け入れます。最初のパラメータはファイル ポインタ、2 番目のパラメータはバイト ストリーム モードです。オプションは 3 つあります。

  • 0: バイトストリームモードはそのままです。
  • -1 (またはその他の負の値): マルチバイト文字ストリームに設定します。
  • 1 (またはその他の正の値): ワイド文字ストリームに設定します。

fwide() の戻り値も 3 つの状況に分けられます。ワイド文字ストリームの場合は正の値が返され、マルチバイト文字ストリームの場合は負の値が返されます。通常の文字ストリームの場合、「0」が返されます。

バイト ストリーム モードは、一度設定すると変更できません。

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

int main(void) {
  wprintf(L"Hello world!\n");
  int モード = fwide(stdout, 0);
  wprintf(L"ストリームは %ls 指向です\n", モード < 0 ? L"バイト" : L"ワイド");
}

上記の例では、wprintf() は暗黙的にバイト ストリームをワイド文字モードに設定するため、fwide(stdout, 0) の戻り値は 0 より大きくなります。

ワイド文字用の特殊関数

以下の関数は、基本的に stdio.h の文字処理関数のワイド文字バージョンです。ワイド文字を操作するには、これらの関数を使用する必要があります。

  • fgetwc() は、 fgetc() に対応して、ワイド文字ストリームからワイド文字を取得します。
  • fgetws() は、 fgets() に対応するワイド文字ストリームからワイド文字列を読み取ります。
  • fputwc() は、 fputc() に対応して、ワイド文字をワイド文字ストリームに書き込みます。
  • fputws() は、 fputs() に対応して、ワイド文字列をワイド文字ストリームに書き込みます。
  • fwprintf() は、fprintf() に対応して、ワイド出力をワイド文字ストリームにフォーマットします。
  • fwscanf() fscanf() に対応する、ワイド文字ストリームからのフォーマットされたワイド文字入力。
  • getwchar() getchar() に対応する、標準入力からワイド文字を取得します。
  • getwc() は、getc() に対応する標準入力からワイド文字を取得します。
  • putwchar() は、putchar() に対応するワイド文字を stdout に書き込みます。
  • putwc() は、putc() に対応するワイド文字を stdout に書き込みます。
  • swprintf() は、sprintf() に対応して、ワイド出力をワイド文字列にフォーマットします。
  • swscanf() ワイド文字列からのフォーマットされたワイド入力。sscanf() に対応します。
  • ungetwc() は、ungetc() に対応して、ワイド文字を入力ストリームにプッシュバックします。
  • vfwprintf() は、vfprintf() に対応する、ワイド文字ストリームへの可変パラメータのワイド文字出力をフォーマットしました。
  • vfwscanf() vfscanf() に対応する、ワイド文字ストリームからの可変引数形式のワイド文字入力。
  • vswprintf() は、vswprintf() に対応する、可変パラメーターのワイド文字出力をワイド文字列にフォーマットしました。
  • vswscanf() ワイド文字列からの可変引数形式のワイド文字入力。 vsscanf() に対応します。
  • vwprintf() 変数パラメーター形式のワイド文字出力。vprintf() に対応します。
  • vscanf() に対応する、vwscanf() 変数パラメーターのフォーマットされたワイド文字入力。
  • wcscat() は、strcat() に対応するワイド文字列を危険に連結します。
  • wcschr() は、strchr() に対応する、ワイド文字列内のワイド文字を検索します。
  • wcscmp() は、strcmp() に対応するワイド文字列を比較します。
  • wcscoll() は、strcoll() に対応し、ロケールを考慮して 2 つのワイド文字列を比較します。
  • wcscpy() は、strcpy() に対応するワイド文字列をコピーする危険があります。
  • wcscspn() は、strcspn() に対応するワイド文字列の先頭から文字のカウントを開始しません。
  • wcsftime() でフォーマットされた日付と時刻の出力。strftime() に対応します。
  • wcslen() は、strlen() に対応するワイド文字列の長さを返します。
  • wcsncat() strncat() に対応して、ワイド文字列をより安全に連結します。
  • wcsncmp() は、strncmp() に対応する、長さが制限された比較的幅の広い文字列です。
  • wcsncpy() は、ワイド文字列をより安全にコピーします。strncpy() に対応します。
  • wcspbrk() は、strpbrk() に対応するワイド文字セットの 1 つをワイド文字列で検索します。
  • wcsrchr() は、strrchr() に対応して、ワイド文字列内のワイド文字を末尾から検索します。
  • wcsspn() は、strspn() に対応するワイド文字列の前にあるセットから文字をカウントします。
  • wcsstr() は、strstr() に対応する、別のワイド文字列内のワイド文字列を検索します。
  • wcstod() は、strtod() に対応して、ワイド文字列を double に変換します。
  • wcstof() は、strtof() に対応して、ワイド文字列を float に変換します。
  • wcstok() は、strtok() に対応するワイド文字列をマークします。
  • wcstold() は、strtold() に対応して、ワイド文字列をロング double に変換します。
  • wcstoll() は、strtoll() に対応して Wide 文字列を Long Long に変換します。
  • wcstol() は、strtol() に対応して、ワイド文字列をロング文字列に変換します。
  • wcstoull() は、strtoull() に対応して、ワイド文字列を符号なしの Long Long に変換します。
  • wcstoul() は、strtoul() に対応して、ワイド文字列を符号なしロング文字列に変換します。
  • wcsxfrm() は、ロケールに基づいて比較するためにワイド文字列を変換し、strxfrm() に対応します。
  • wmemcmp() は、memcmp() に対応して、メモリ内のワイド文字を比較します。
  • wmemcpy() は、memcpy() に対応するワイド文字メモリをコピーします。
  • wmemmove() は、memmove() に対応して、ワイド文字メモリをコピーします (重複する可能性があります)。
  • wprintf() は、printf() に対応するワイド出力をフォーマットします。
  • wscanf() は、scanf() に対応するワイド入力をフォーマットします。

マルチバイト文字用の特殊関数

wchar.h では、マルチバイト文字用の特別な関数もいくつか定義されています。

  • mbsinit() は、mbstate_t が初期変換状態にあるかどうかを判断します。
  • mbrlen() mblen() に対応する、変換ステータスを指定してマルチバイト文字列内のバイト数を計算します。
  • mbtowc() mbtowc() に対応し、変換ステータスが与えられたときにマルチバイト文字をワイド文字に変換します。
  • wctomb() 変換ステータスが与えられた場合、ワイド文字をマルチバイト文字に変換します (wctomb() に対応)。
  • mbsrtowcs() mbstowcs() に対応し、変換ステータスが与えられたときにマルチバイト文字列をワイド文字列に変換します。
  • wcsrtombs() 変換ステータスが指定された場合、wcstombs() に対応して、ワイド文字列をマルチバイト文字列に変換します。

作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0