mbtowc | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


mbtowc関数 🔗

概要

マルチバイト文字をワイド文字に変換する。

ヘッダ

stdlib.h

形式

int mbtowc(wchar_t* restrict ws, const char* restrict s, size_t n);

引数

ws

変換結果を受け取るメモリアドレス。受け取らない場合はヌルポインタでも良い。

s

変換対象のマルチバイト文字列。

n

変換する最大バイト数。

戻り値

引数s がヌルポインタでない場合は、引数s が指すバイトから、引数n で指定したバイト数だけを調べ、それがマルチバイト文字として有効なバイト列であれば、マルチバイト文字を構成するバイト数を返す。有効なバイト列でなければ -1 を返す。なお、引数s がヌル文字(‘\0’) を指している場合は 0 を返す。
引数s がヌルポインタであれば、現在のロケールのマルチバイト文字の表現形式がシフト状態に依存する場合は 0以外の値を返し、依存しない場合は 0 を返す。

詳細

バイト列がマルチバイト文字を構成しているものと考え、引数 n で指定したバイト数分だけ調べる。マルチバイト文字が必要とする可能性がある最大バイト数は、ロケールによって異なるので、引数n には MB_CUR_MAX を指定することが多い。調べた範囲が、有効なマルチバイト文字を構成していれば、それに対応するワイド文字の値を決定し、その値を引数ws で指定した位置へ格納する。引数ws がヌルポインタの場合は格納せず処理を終える。
引数s にヌルポインタを指定した場合、内部の変換状態が初期状態に戻される。
この関数は、ロケールの LC_CTYPE カテゴリの影響を受ける。

注意

あくまで文字の変換なので、末尾に終端文字(L’\0’) は付加されない。

使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
    const char mb[] = "あいうえお";

    // LC_CTYPE をネイティブロケールに変更
    if (setlocale(LC_CTYPE, "") == NULL) {
        fputs("ロケールの設定に失敗しました。\n", stderr);
        return EXIT_FAILURE;
    }

    int i = 0;

    for (;;) {
        wchar_t wc;

        const int result = mbtowc(&wc, &mb[i], MB_CUR_MAX);
        if (result > 0) {
            wprintf(L"%lc", wc);
            i += result;
        }
        else {
            break;
        }
    }
    wprintf(L"\n");
}

実行結果:

あいうえお
関連

逆方向の変換であるワイド文字からマルチバイト文字列への変換は、wctomb関数で行える。なお、終端文字のあるマルチバイト文字列からワイド文字列への変換は、mbstowcs関数で行える。
再開可能な形でマルチバイト文字からワイド文字への変換を行う mbrtowc関数がある。

解説章

第47章


参考リンク 🔗

本ページはアフィリエイトプログラムによる収益を得ています。
以下のリンクから商品を購入されると、Programming Place 管理者に紹介料が支払われています。


更新履歴 🔗

 解説中で C95 を(C89 に対して)特別扱いしないように修正。そもそもC言語編は C95ベースなので、余計な説明は省く。

 「NULL」という表記を「ヌルポインタ」に修正。

 全体的に文章を見直し修正。

 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る