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
参数
[out]wcstr
宽字符序列的地址。[in]mbstr
空序列的地址停止多字节字符。[in] count
多字节字符的最大数量转换。[in] locale
使用的区域设置。
返回值
如果 mbstowcs 成功转换源字符串,它返回转换的多字节字符数。 如果 wcstr 参数是 NULL,该函数返回需的大小 (以宽字符) 的目标字符串。 如果 mbstowcs 遇到无效的多字节字符,则返回 – 1。 如果返回值为 count,宽字符字符串不以 null 终止。
安全说明 |
---|
确保 wcstr 和 mbstr 重叠,并且, count 准确反映多字节字符数转换。 |
备注
mbstowcs 函数转换到 countmbstr 点的转换多字节字符的最大数字转换为当前区域设置确定相应的宽字符的字符串。 它存储发生的宽字符字符串。 wcstr表示的地址*。*则结果将类似于一系列调用 mbtowc。 如果 mbstowcs 遇到单字节 null 字符 (“\ 0 ") 或前面,或者 count 时,它将 null 字符转换为宽字符 null 字符 (L' \ 0 ") 和停止。 因此在转换过程中,,因此,只有当 null 字符遇到在 wcstr 的宽字符字符串 null 结尾。 如果顺序指向由 wcstr 和 mbstr 重叠,该行为不确定。
如果 wcstr 参数是 NULL, mbstowcs 返回要由转换宽字符数,不包括 null 结束符。 必须以 null 终止的源字符串才能返回正确的值。 如果您需要发生的宽字符字符串 null 终止,请添加一个返回的值。
如果 mbstr 参数是 NULL,或者,如果 count 是 AMP_GT INT_MAX,无效参数调用处理程序,如 参数验证 所述。 如果执行允许继续, errno 设置为 EINVAL ,函数返回 -1。
mbstowcs 为所有与区域设置相关的行为使用当前区域设置; _mbstowcs_l与相同,但它使用的区域设置。 有关更多信息,请参见 区域设置。
在 C++ 中,这些函数的调用的模板重载越+新,保证这些函数副本。 有关更多信息,请参见 安全模板重载。
要求
实例 |
必需的头 |
---|---|
mbstowcs |
stdlib.h |
_mbstowcs_l |
stdlib.h |
有关其他的兼容性信息,请参见中介绍的 兼容性 。
示例
// 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。有关更多信息,请参见 平台调用示例。