名前空間
変種
操作

mbsrtowcs, mbsrtowcs_s

From cppreference.com
< c‎ | string‎ | multibyte
ヘッダー <wchar.h> で定義
(1)
size_t mbsrtowcs( wchar_t* dst, const char** src, size_t len, mbstate_t* ps );
(C95 以降)
(C99まで)
size_t mbsrtowcs( wchar_t *restrict dst, const char **restrict src, size_t len,
                  mbstate_t *restrict ps );
(C99以降)
errno_t mbsrtowcs_s( size_t *restrict retval,

                     wchar_t *restrict dst, rsize_t dstsz,
                     const char **restrict src, rsize_t len,

                     mbstate_t *restrict ps );
(2) (C11 以降)
1) *ps で記述された変換状態から始まる、ヌル終端されたマルチバイト文字シーケンスを、そのワイド文字表現に変換します。dst がヌルでない場合、変換された文字は *src が指す配列の successive elements に格納されます。宛先配列には len 個のワイド文字までしか書き込まれません。各マルチバイト文字は、mbrtowc の呼び出しのように変換されます。変換は以下の場合に停止します。
  • ヌル文字が変換されて格納された場合。*src はヌルポインタ値に設定され、*ps は初期シフト状態を表します。
  • 無効なマルチバイト文字(現在の C ロケールによる)が検出された場合。*src は、変換されていない最初のマルチバイト文字の先頭を指すように設定されます。
  • 次に格納されるワイド文字が len を超える場合。*src は、変換されていない最初のマルチバイト文字の先頭を指すように設定されます。dst がヌルポインタの場合、この条件はチェックされません。
2) 以下を除いて (1) と同じです。
  • 関数は、出力パラメータ retval に結果を返します。
  • len 個のワイド文字が書き込まれた後もヌル文字が dst に書き込まれなかった場合、dst[len]L'\0' が格納され、合計 len+1 個のワイド文字が書き込まれます。
  • 関数は、終端ヌル文字から dstsz までの宛先配列を上書きします。
  • srcdst が重なる場合、動作は未定義です。
  • すべて境界チェック関数と同様に、以下のエラーは実行時に検出され、現在インストールされている 制約ハンドラ 関数が呼び出されます。
  • retvalpssrc、または *src がヌルポインタである。
  • dstsz または lenRSIZE_MAX/sizeof(wchar_t) より大きい(dst がヌルの場合を除く)。
  • dstsz がゼロでない(dst がヌルでない場合)。
  • *src 配列の最初の dstsz 個のマルチバイト文字にヌル文字がなく、lendstsz より大きい(dst がヌルの場合を除く)。
すべての境界チェック関数と同様に、mbsrtowcs_s は、実装によって __STDC_LIB_EXT1__ が定義され、ユーザーが <wchar.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 として定義した場合にのみ、利用が保証されます。

目次

[編集] パラメータ

dst - 結果が格納されるワイド文字配列へのポインタ
src - ヌル終端されたマルチバイト文字列の最初の要素へのポインタへのポインタ
len - dstが指す配列で利用可能なワイド文字数
ps - 変換状態オブジェクトへのポインタ。
dstsz - 書き込まれるワイド文字の最大数(dst 配列のサイズ)
retval - 結果が格納される size_t オブジェクトへのポインタ

[編集] 戻り値

1) 成功した場合、終端の L'\0' を除く、文字配列に書き込まれたワイド文字数を返します。dst がヌルポインタの場合、無制限の長さで書き込まれたであろうワイド文字数を返します。変換エラー(無効なマルチバイト文字が検出された場合)の場合、(size_t)-1 を返し、errnoEILSEQ を格納し、*ps を未指定の状態のままにします。
2) 成功した場合(その場合、終端ゼロを除く、dst に書き込まれた、または書き込まれたであろうワイド文字数が *retval に格納されます)、ゼロを返します。エラーの場合、非ゼロを返します。実行時制約違反の場合、*retval(size_t)-1 を格納し(retval がヌルでない場合)、dst[0]L'\0' に設定します(dst がヌルであるか、dstmax がゼロまたは RSIZE_MAX 以上である場合を除く)。

[編集]

#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#include <string.h>
 
void print_as_wide(const char* mbstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len = 1 + mbsrtowcs(NULL, &mbstr, 0, &state);
    wchar_t wstr[len];
    mbsrtowcs(&wstr[0], &mbstr, len, &state);
    wprintf(L"Wide string: %ls \n", wstr);
    wprintf(L"The length, including L'\\0': %zu\n", len);
}
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    print_as_wide(u8"z\u00df\u6c34\U0001f34c"); // u8"zß水🍌"
}

出力

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

[編集] 参考文献

  • C11標準 (ISO/IEC 9899:2011)
  • 7.29.6.4.1 mbsrtowcs 関数 (p: 445)
  • K.3.9.3.2.1 mbsrtowcs_s 関数 (p: 648-649)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.24.6.4.1 mbsrtowcs 関数 (p: 391)

[編集] 関連項目

ナローマルチバイト文字列をワイド文字列に変換する
(関数) [編集]
与えられた状態で、次のマルチバイト文字をワイド文字に変換する
(関数) [編集]
与えられた状態で、ワイド文字列をナローマルチバイト文字列に変換する
(関数) [編集]
C++ ドキュメント mbsrtowcs について
English 日本語 中文(简体) 中文(繁體)