Namespaces
Variants

std:: mbsrtowcs

From cppreference.net
ヘッダーで定義 <cwchar>
std:: size_t mbsrtowcs ( wchar_t * dst,

const char ** src,
std:: size_t len,

std:: mbstate_t * ps ) ;

変換状態 * ps で記述される状態から開始し、 * src が指す先頭要素から始まるnull終端マルチバイト文字シーケンスを、ワイド文字表現に変換します。 dst がnullでない場合、変換された文字は dst が指すwchar_t配列の連続する要素に格納されます。最大で len 個のワイド文字が変換先配列に書き込まれます。

各マルチバイト文字は、 std::mbrtowc の呼び出しによって変換されます。変換は以下の場合に停止します:

  • マルチバイトのヌル文字が変換され格納されました。 src はヌルポインタに設定され、 *ps は初期シフト状態を表します。
  • 無効なマルチバイト文字(現在のCロケールに従って)が検出されました。 src は最初の未変換マルチバイト文字の先頭を指すように設定されます。
  • 次に格納されるワイド文字が len を超える場合。 src は最初の未変換マルチバイト文字の先頭を指すように設定されます。この条件は dst がヌルポインタの場合にはチェックされません。

目次

パラメータ

dst - 結果が格納されるワイド文字配列へのポインタ
src - ナル終端マルチバイト文字列の最初の要素へのポインタへのポインタ
len - dstが指す配列で利用可能なワイド文字の数
ps - 変換状態オブジェクトへのポインタ

戻り値

成功時には、終端の L ' \0 ' を除いて、文字配列に書き込まれたワイド文字の数を返します。 dst がnullポインタの場合、長さ制限なしで書き込まれたであろうワイド文字の数を返します。

変換エラーが発生した場合(無効なマルチバイト文字が検出された場合)、 static_cast < std:: size_t > ( - 1 ) を返し、 EILSEQ errno に格納し、 * ps を未規定の状態にします。

注記

この関数は src ポインタを変換後のマルチバイト文字列の終端に移動します。これは dst がnullポインタの場合には発生しません。

#include <clocale>
#include <cwchar>
#include <iostream>
#include <vector>
void print_as_wide(const char* mbstr)
{
    std::mbstate_t state = std::mbstate_t();
    std::size_t len = 1 + std::mbsrtowcs(nullptr, &mbstr, 0, &state);
    std::vector<wchar_t> wstr(len);
    std::mbsrtowcs(&wstr[0], &mbstr, wstr.size(), &state);
    std::wcout << "Wide string: " << &wstr[0] << '\n'
               << "The length, including '\\0': " << wstr.size() << '\n';
}
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    const char* mbstr = "z\u00df\u6c34\U0001f34c"; // or u8"zß水🍌"
    print_as_wide(mbstr);
}

出力:

Wide string: zß水🍌
The length, including '\0': 5

関連項目

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