mbstowcs、_mbstowcs_l
ワイド文字のシーケンスに対応するマルチバイト文字のシーケンスを変換します。これらの関数のセキュリティを強化したバージョンについては、「mbstowcs_s、_mbstowcs_s_l」を参照してください。
size_t mbstowcs(
wchar_t *wcstr,
const char *mbstr,
size_t count
);
size_t _mbstowcs_l(
wchar_t *wcstr,
const char *mbstr,
size_t count,
_locale_t locale
);
template <size_t size>
size_t mbstowcs(
wchar_t (&wcstr)[size],
const char *mbstr,
size_t count
); // C++ only
template <size_t size>
size_t _mbstowcs_l(
wchar_t (&wcstr)[size],
const char *mbstr,
size_t count,
_locale_t locale
); // C++ only
パラメーター
[出力] wcstr
ワイド文字シーケンスのアドレス。[入力]mbstr
null 値のシーケンスのアドレスはマルチ バイト文字を終了しました。[入力] count
変換するマルチバイト文字の最大数。[入力] locale
使用するロケール。
戻り値
が正常に mbstowcs ソース文字列を変換し変換されたマルチバイト文字数を返します。wcstr の引数が NULL 場合関数の戻り値はコピー先文字列の必要なサイズ (ワイド文字単位)。mbstowcs に無効なマルチバイト文字が発生した場合は– 1 を返します。戻り値が count 場合ワイド文字列が null で終了していません。
セキュリティに関するメモ |
---|
wcstr と mbstr が重複しないことおよび count を変換するためにマルチバイト文字数を反映していることを確認します。 |
解説
mbstowcs の関数は現在のロケールで決められた対応するワイド文字の文字列に mbstr が指す count のマルチバイト文字の最大数まで変換します。これは wcstr によって表されるアドレスで発生するワイド文字列を格納します *。*結果は mbtowc に一連の呼び出しに似ています。mbstowcs がバイト count null 文字が発生すると (\ 0) にある場合停止またはワイド文字 L の NULL 文字 (\ 0) の null 文字を変換します。したがって wcstr のワイド文字列が NULL 文字は変換中に検出された場合にのみ null 終了します。wcstr して mbstr の重複が指すシーケンスの動作は未定義です。
wcstr の引数が NULL 場合はmbstowcs 変換に発生するNULL 終端文字を含めてワイド文字数を返します。ソース文字列を返します。正しい値が null で終了する必要があります。生成されたワイド文字列が null で終わる必要がある場合は戻り値に 1 を加算します。
mbstr の引数が NULL であるかまたは count が > INT_MAX いるように無効なパラメーター ハンドラーが パラメーターの検証 に説明されているように開始されます。実行の継続が許可 EINVAL errno は関数の戻り値 -1 に設定されます。
mbstowcs はすべてのロケールに依存する動作に現在のロケールを使用します ; _mbstowcs_l は同じですが代わりに渡されたロケールを使用します。詳細については、「ロケール」を参照してください。
C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、これらの関数に対応するセキュリティで保護された新しい関数を呼び出します。詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
mbstowcs |
<stdlib.h> |
_mbstowcs_l |
<stdlib.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_mbstowcs.c
// compile with: /W3
// illustrates the behavior of the mbstowcs function
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
int main( void )
{
size_t size;
int nChar = 2; // number of characters to convert
int requiredSize;
unsigned char *pmbnull = NULL;
unsigned char *pmbhello = NULL;
char* localeInfo;
wchar_t *pwchello = L"\x3042\x3043"; // 2 Hiragana characters
wchar_t *pwc;
/* Enable the Japanese locale and codepage */
localeInfo = setlocale(LC_ALL, "Japanese_Japan.932");
printf("Locale information set to %s\n", localeInfo);
printf( "Convert to multibyte string:\n" );
requiredSize = wcstombs( NULL, pwchello, 0); // C4996
// Note: wcstombs is deprecated; consider using wcstombs_s
printf(" Required Size: %d\n", requiredSize);
/* Add one to leave room for the null terminator. */
pmbhello = (unsigned char *)malloc( requiredSize + 1);
if (! pmbhello)
{
printf("Memory allocation failure.\n");
return 1;
}
size = wcstombs( pmbhello, pwchello, requiredSize + 1); // C4996
// Note: wcstombs is deprecated; consider using wcstombs_s
if (size == (size_t) (-1))
{
printf("Couldn't convert string. Code page 932 may"
" not be available.\n");
return 1;
}
printf( " Number of bytes written to multibyte string: %u\n",
(unsigned int) size );
printf( " Hex values of the " );
printf( " multibyte characters: %#.2x %#.2x %#.2x %#.2x\n",
pmbhello[0], pmbhello[1], pmbhello[2], pmbhello[3] );
printf( " Codepage 932 uses 0x81 to 0x9f as lead bytes.\n\n");
printf( "Convert back to wide-character string:\n" );
/* Assume we don't know the length of the multibyte string.
Get the required size in characters, and allocate enough space. */
requiredSize = mbstowcs(NULL, pmbhello, 0); // C4996
/* Add one to leave room for the NULL terminator */
pwc = (wchar_t *)malloc( (requiredSize + 1) * sizeof( wchar_t ));
if (! pwc)
{
printf("Memory allocation failure.\n");
return 1;
}
size = mbstowcs( pwc, pmbhello, requiredSize + 1); // C4996
if (size == (size_t) (-1))
{
printf("Couldn't convert string--invalid multibyte character.\n");
}
printf( " Characters converted: %u\n", (unsigned int)size );
printf( " Hex value of first 2" );
printf( " wide characters: %#.4x %#.4x\n\n", pwc[0], pwc[1] );
free(pwc);
free(pmbhello);
}
同等の .NET Framework 関数
該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。