Namespaces
Variants

mbstowcs, mbstowcs_s

来自 zh.cppreference.net
定义于头文件 <stdlib.h>
size_t mbstowcs( wchar_t* dst, const char* src, size_t len)
(1) (直到 C99)
size_t mbstowcs( wchar_t* restrict dst, const char* restrict src, size_t len)
(自 C99)
errno_t mbstowcs_s(size_t* restrict retval, wchar_t* restrict dst,
                  rsize_t dstsz, const char* restrict src, rsize_t len);
(2) (自 C11)
1) 将多字节字符串从首元素由 src 指向的数组转换为其宽字符表示。转换后的字符存储在 dst 指向的数组的连续元素中。写入目标数组的宽字符不超过 len 个。
每个字符的转换如同调用 mbtowc,但 mbtowc 的转换状态不受影响。转换在以下情况下停止:
  • 多字节空字符被转换并存储。
  • 遇到(在当前 C 本地环境中)无效的多字节字符。
  • 下一个要存储的宽字符将超过 len。
如果 src 和 dst 重叠,则行为未定义。
2) 与 (1) 相同,但:
  • 转换如同由 mbrtowc 进行,而非 mbtowc
  • ;该函数通过输出参数 retval
  • 返回结果;如果写入 dst 的宽字符之后没有空字符,且已写入 len 个宽字符,则将 L'\0' 存入 dst[len],这意味着总共写入 len+1 个宽字符;
  • 如果 dst 是空指针,则将可能产生的宽字符数存入 *retval
  • ;该函数会覆盖目标数组中从终止空字符到 dstsz
  • 之间的部分;如果 src 和 dst 重叠,则行为未指定。
  • 以下错误在运行时检测并调用当前安装的 约束处理程序函数:
  • retval 或 src 是空指针
  • dstsz 或 len 大于 RSIZE_MAX / sizeof(wchar_t)(除非 dst 为空)
  • dstszdst 不为零(除非
  • 为空)dstszsrc 数组的前 len 个多字节字符中没有空字符,且 dstsz 大于 dst(除非
为空)mbstowcs_s与所有边界检查函数一样,__STDC_LIB_EXT1__ 仅当实现定义了 __STDC_WANT_LIB_EXT1__ 且用户在包含 1stdlib.h< 之前将 > 定义为整数常量

参阅

注解mbstowcs在大多数实现中, 在处理字符串时会更新一个类型为 mbstate_t 的全局静态对象,因此不能同时由两个线程调用;在这种情况下应使用 mbsrtowcs

。 dstPOSIX 指定了一个常见扩展:如果 dst 是空指针,此函数返回如果转换则会写入 mbstowcs_s 的宽字符数。类似的行为对 和 mbsrtowcs

是标准的。

参数 dst -
指向将存储宽字符串的宽字符数组的指针 src -
指向待转换的空终止多字节字符串首元素的指针 len -
dst 所指向数组中可用的宽字符数 dstsz - dst将写入的最大宽字符数(
数组的大小) retval -

指向 size_t 对象的指针,结果将存储在该对象中

返回值1)L'\0' 成功时,返回写入目标数组的宽字符数(不包括终止的 (size_t)-1)。发生转换错误(遇到无效多字节字符)时,返回
。2)dst 成功时返回零(此时已写入或将要写入 *retval 的宽字符数(不包括终止零)存储在 (size_t)-1 中),错误时返回非零。发生运行时约束冲突时,将 *retval 存入 retval(除非 dst[0] 为空)并将 L'\0' 设置为 dst(除非 dstmax 为空或 为零或大于 RSIZE_MAX

)

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char* mbstr = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
    wchar_t wstr[5];
    mbstowcs(wstr, mbstr, 5);
    wprintf(L"MB string: %s\n", mbstr);
    wprintf(L"Wide string: %ls\n", wstr);
}

运行此代码

MB string: zß水🍌
Wide string: zß水🍌

输出:

  • 引用标准
  • C23 标准 (ISO/IEC 9899:2024):
  • 7.22.8.1 mbstowcs 函数 (p: TBD)
  • K.3.6.5.1 mbstowcs_s 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.22.8.1 mbstowcs 函数 (p: TBD)
  • K.3.6.5.1 mbstowcs_s 函数 (p: TBD)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.22.8.1 mbstowcs 函数 (p: 359)
  • K.3.6.5.1 mbstowcs_s 函数 (p: 611-612)
  • C99 标准 (ISO/IEC 9899:1999):
  • 7.20.8.1 mbstowcs 函数 (p: 323)
  • C89/C90 标准 (ISO/IEC 9899:1990):

4.10.8.1 mbstowcs 函数

mbsrtowcs_s(C95)
(C11)
将窄多字节字符串转换为宽字符串,给定状态
(C11)
将宽字符串转换为窄多字节字符串
(函数)C++ 文档 对于
mbstowcs