Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のmbtowc関数とは?マルチバイト文字をワイド文字に変換する方法

C標準ライブラリの関数 int mbtowc(wchar_t *pwc, const char *str, size_t n) は、マルチバイト文字シーケンス(複数バイトで構成される文字列)を1つのワイド文字(wchar_t型)に変換します。

プロトタイプ宣言

int mbtowc(wchar_t *pwc, const char *str, size_t n);

パラメータ

  • pwc − 変換結果のワイド文字を格納する wchar_t 型オブジェクトへのポインタです。
  • str − 変換対象となるマルチバイト文字の先頭バイトへのポインタです。
  • n − 文字の長さを判定するために読み込む最大バイト数です。

戻り値

  • str が NULL でない場合:str の先頭から読み込んで消費したバイト数を返します。str が null バイト('\0')を指している場合は 0 を、変換に失敗した場合は -1 を返します。
  • str が NULL の場合:現在のロケールのエンコーディングがシフト状態を持つ場合(ステートフルな場合)は非ゼロの値を、状態を持たない場合(ステートレスな場合)は 0 を返します。

なお、str に NULL を渡して呼び出すと、内部の変換状態をリセットする役割も果たします。

サンプルプログラム

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>

int main(void) {
    char *str = "This is tutorialspoint.com";
    wchar_t mb[100];
    wchar_t wc;
    size_t i = 0, used = 0;
    int ret;

    setlocale(LC_ALL, "");

    while (str[i] != '\0' && used < 99) {
        ret = mbtowc(&wc, str + i, MB_CUR_MAX);
        if (ret <= 0) break;
        mb[used++] = wc;
        i += ret;
    }
    mb[used] = L'\0';

    wprintf(L"%ls\n", mb);
    return 0;
}

実行結果

This is tutorialspoint.com

解説と注意点

上記のプログラムでは、まず setlocale() でロケールを設定し、while ループ内で mbtowc() を繰り返し呼び出すことで、文字列全体を1文字ずつワイド文字に変換しています。mbtowc() の戻り値は「消費したバイト数」を表すため、その分だけインデックスを進めるのがポイントです。

mbtowc() を1回だけ呼び出した場合、変換されるのは文字列の先頭1文字のみである点に注意してください。また、ターミナルや実行環境のロケール設定が正しくないと、出力が ??? のように文字化けすることがあります。

類似の関数として、マルチバイト文字のバイト数を調べる mblen() や、より安全で再開可能な変換を行う mbrtowc() などがあります。マルチスレッド環境では状態を持たない mbrtowc() の使用が推奨されます。

  1. C言語のfillpoly()関数とは?図形の塗りつぶし方法を解説

    概要C言語のグラフィックス用ヘッダーファイル「graphics.h」には、三角形、四角形、五角形、六角形などの多角形(ポリゴン)を描画し、その内部を塗りつぶすための fillpoly() 関数が用意されています。この関数は、線のみを描く drawpoly() 関数と同じ引数を受け取る点が特徴です。構文void fillpoly( int number, int *polypoints );各引数の意味は以下の通りです。number:頂点の数を n とした場合、「n + 1」個の点の数を指定します。polypoints:「n × 2」個の整数からなる配列へのポインタです。整数は2つで1組となり、

  2. C言語のbar()関数とは?グラフィックスで塗りつぶし矩形を描く方法

    bar() 関数は、C言語のグラフィックス描画に使用される関数の一つです。図形を描くための各種関数がまとめられた graphics.h ヘッダーファイルの中に定義されており、このヘッダーをインクルードすることで利用できます。bar()関数の構文void bar(int left, int top, int right, int bottom);bar() 関数は、棒グラフの「バー」のような2次元の図形、すなわち塗りつぶされた長方形を描画するために使われます。引数は4つあり、それぞれ以下の座標を指定します。left / top: 長方形の左上隅の (X, Y) 座標right / bottom: