Namespaces
Variants

std:: mbtowc

From cppreference.net
ヘッダーで定義 <cstdlib>
int mbtowc ( wchar_t * pwc, const char * s, std:: size_t n ) ;

s が指す先頭バイトから始まるマルチバイト文字をワイド文字に変換し、 pwc がnullでない場合、変換結果を * pwc に書き込みます。

s がヌルポインタの場合、グローバル変換状態をリセットし、シフトシーケンスが使用されるかどうかを判定します。

目次

パラメータ

s - マルチバイト文字へのポインタ
n - sで検査可能なバイト数の上限
pwc - 出力用ワイド文字へのポインタ

戻り値

s が null ポインタでない場合、マルチバイト文字に含まれるバイト数を返す。または - 1 を返す( s が指す先頭バイト列が有効なマルチバイト文字を構成しない場合)。または 0 を返す( s がナル文字 ' \0 ' を指している場合)。

s が null ポインタの場合、内部の変換状態を初期シフト状態を表すようにリセットし、現在のマルチバイトエンコーディングが状態依存でない場合(シフトシーケンスを使用しない)は 0 を返し、現在のマルチバイトエンコーディングが状態依存の場合(シフトシーケンスを使用する)は非ゼロの値を返します。

注記

mbtowc の各呼び出しは、内部のグローバル変換状態(この関数のみが知る std::mbstate_t 型の静的オブジェクト)を更新します。マルチバイトエンコーディングがシフト状態を使用する場合、バックトラッキングや複数回のスキャンを避けるよう注意が必要です。いずれにせよ、複数のスレッドが同期なしに mbtowc を呼び出すべきではありません。代わりに std::mbrtowc の使用が推奨されます。

#include <clocale>
#include <cstdlib>
#include <cstring>
#include <iostream>
int print_mb(const char* ptr)
{
    std::mbtowc(nullptr, 0, 0); // 変換状態をリセット
    const char* end = ptr + std::strlen(ptr);
    int ret{};
    for (wchar_t wc; (ret = std::mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret)
        std::wcout << wc;
    std::wcout << '\n';
    return ret;
}
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    // UTF-8 ナローマルチバイトエンコーディング
    const char* str = "z\u00df\u6c34\U0001d10b"; // または "zß水𝄋"
                      // または "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

出力:

zß水𝄋

関連項目

状態を指定して次のマルチバイト文字をワイド文字に変換する
(関数)
次のマルチバイト文字のバイト数を返す
(関数)
[virtual]
ExternT から InternT への文字列変換(ファイル読み込み時など)
( std::codecvt<InternT,ExternT,StateT> の仮想保護メンバ関数)