mbsrtowcs, mbsrtowcs_s
From cppreference.com
| ヘッダー <wchar.h> で定義 |
||
| (1) | ||
| (C95 以降) (C99まで) |
||
| (C99以降) | ||
| (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までの宛先配列を上書きします。 srcとdstが重なる場合、動作は未定義です。- すべて境界チェック関数と同様に、以下のエラーは実行時に検出され、現在インストールされている 制約ハンドラ 関数が呼び出されます。
-
retval、ps、src、または*srcがヌルポインタである。 -
dstszまたはlenが RSIZE_MAX/sizeof(wchar_t) より大きい(dstがヌルの場合を除く)。 -
dstszがゼロでない(dstがヌルでない場合)。 *src配列の最初のdstsz個のマルチバイト文字にヌル文字がなく、lenがdstszより大きい(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 を返し、errno に EILSEQ を格納し、*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)
[編集] 関連項目
| (C11) |
ナローマルチバイト文字列をワイド文字列に変換する (関数) |
| (C95) |
与えられた状態で、次のマルチバイト文字をワイド文字に変換する (関数) |
| (C95)(C11) |
与えられた状態で、ワイド文字列をナローマルチバイト文字列に変換する (関数) |
| C++ ドキュメント
mbsrtowcs について | |