mbsrtowcs() — マルチバイト文字列をワイド文字の文字列に変換します
形式
#include <wchar.h>
size_t mbsrtowcs (wchar_t *dst, const char **src, size_t len,
mbstate_t *ps);言語レベル
ANSI
スレッド・セーフ
はい (ps が NULL 以外の場合)。
ロケール依存
この関数の振る舞いは、現行ロケールの LC_CTYPE カテゴリーの影響を受ける可能性があります。 この関数は、LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) をコンパイル・コマンドで指定した場合も、現行ロケールの LC_UNI_CTYPE カテゴリーによって影響を受ける可能性があります。 この関数は、コンパイル・コマンドに対して LOCALETYPE(*CLD) が指定されている場合には使用できません。 詳しくは、 CCSID とロケールについてを参照してください。
ワイド文字関数
詳しくは、 ワイド文字 を参照してください。
説明
この関数は、 mbstowcs()の再始動可能バージョンです。
mbsrtowcs() 関数は、 ps によって記述される変換状態で始まるマルチバイト文字のシーケンスを、 src によって間接的に指し示される配列から、対応するワイド文字のシーケンスに変換します。 次に、dst で示される配列に、変換された文字を保管します。
変換は終了のヌル文字 (これを含む) まで続行し、このヌル文字も保管されます。 変換は次の 2 つの場合、早期に停止します。すなわち、有効なマルチバイト文字を形成しないバイトのシーケンスに達したとき、または (dst が NULL ポインターでない場合に) len ワイド文字が、dst が指す配列に保管されたときです。 各変換は、 mbrtowc() 関数の呼び出しによって行われるかのように行われます。
dst が NULL ポインターでない場合、src が指すポインター・オブジェクトには、NULL ポインターが割り当てられる (終了のヌル文字に達したために変換が停止した場合) か、変換された最後のマルチバイト文字の直後のアドレスが割り当てられます。 終了のヌル文字に達したことにより変換が停止した場合は、初期変換状態が記述されます。
戻り値
入力文字列が有効なマルチバイト文字で始まらない場合、エンコードエラーが発生し、mbsrtowcs() 関数はマクロ EILSEQ の値を errno に格納し、(size_t) -1 を返しますが、変換状態は変更されません。 その他の場合は、正常に変換されたマルチバイト文字の数を戻しますが、これは、dst が NULL ポインターでないときに変更された配列エレメント数と同じです。
変換エラーが発生した場合、errno は ECONVERT に設定される可能性があります。
例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#define SIZE 10
int main(void)
{
char mbs1[] = "abc";
char mbs2[] = "\x81\x41" "m" "\x81\x42";
const char *pmbs1 = mbs1;
const char *pmbs2 = mbs2;
mbstate_t ss1 = 0;
mbstate_t ss2 = 0;
wchar_t wcs1[SIZE], wcs2[SIZE];
if (NULL == setlocale(LC_ALL, "/qsys.lib/locale.lib/ja_jp939.locale"))
{
printf("setlocale failed.\n");
exit(EXIT_FAILURE);
}
mbsrtowcs(wcs1, &pmbs1, SIZE, &ss1);
mbsrtowcs(wcs2, &pmbs2, SIZE, &ss2);
printf("The first wide character string is %ls.\n", wcs1);
printf("The second wide character string is %ls.\n", wcs2);
return 0;
}
/*******************************************************
The output should be similar to:
The first wide character string is abc.
The second wide character string is Am B.
*******************************************************/