C言語編 標準ライブラリのリファレンス wctomb

先頭へ戻る

wctomb関数

概要 ワイド文字をマルチバイト文字列に変換する。
ヘッダ stdlib.h
形式 int wctomb(char* s, const wchar_t w);
引数 s 変換結果を受け取るメモリアドレス。最低でも MB_CUR_MAX以上の要素数が必要。
受け取らない場合は、ヌルポインタでも良い。
w 変換対象のワイド文字。
戻り値 引数s がヌルポインタでない場合は、引数w がマルチバイト文字に変換可能であれば、引数s が指す先へ格納されたマルチバイト文字のバイト数を返す。変換可能でなければ -1 を返す。なお、引数w がヌル文字(L'\0') の場合は 0 を返す。
引数s がヌルポインタであれば、現在のロケールのマルチバイト文字の表現形式がシフト状態に依存する場合は 0以外の値を返し、依存しない場合は 0 を返す。
返される大きさは常に、MB_CUR_MAX 以下である。
詳細 ワイド文字を、対応するマルチバイト文字のバイト列へ変換する。文字数としては、いずれにしても1文字であるが、マルチバイト文字としては何バイト必要とするか分からないので、char型の配列で受け取る。
引数w にヌル文字を指定した場合、内部の変換状態が初期状態に戻される。
この関数は、ロケールの LC_CTYPE カテゴリの影響を受ける。
注意 あくまで文字の変換なので、末尾に終端文字(L'\0') は付加されない。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
    const wchar_t wc = L'多';
    char mb[MB_LEN_MAX + 1];  /* 全ロケールで可能性がある最大の大きさ + 末尾の '\0' */
    int len;

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

    len = wctomb( mb, wc );
    if( len == -1 ){
        fputs( "マルチバイト文字への変換に失敗しました。\n", stderr );
        return EXIT_FAILURE;
    }

    mb[len] = '\0';
    printf( "%s\n", mb );

    return 0;
}

実行結果:

関連 逆方向の変換であるマルチバイト文字からワイド文字への変換は、mbtowc関数で行える。なお、終端文字のあるワイドバイト文字列からマルチバイト文字列への変換は、wcstombs関数で行える。
再開可能な形でワイド文字からマルチバイト文字列への変換を行う wcrtomb関数がある。
解説章 第47章


参考リンク



更新履歴

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

'2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。

'2018/4/11 全体的に文章を見直し修正。

'2018/2/22 「サイズ」という表記について表現を統一。 型のサイズ(バイト数)を表しているところは「大きさ」、要素数を表しているところは「要素数」。

'2018/1/22 新規作成。



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

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

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

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー