std::wctomb
来自 cppreference.com
定义在头文件 <cstdlib> 中 |
||
int wctomb( char* s, wchar_t wc ); |
||
将宽字符 wc 转换为多字节编码,并将它(包括任何移位序列)存储在第一个元素由 s 指向的 char 数组中。存储的字符不超过 MB_CUR_MAX 个。转换受当前区域设置的 LC_CTYPE 类别影响。
如果 wc 是空字符,则将空字节写入 s,前面是恢复初始移位状态所需的任何移位序列。
如果 s 是空指针,则重置全局转换状态并确定是否使用移位序列。
内容 |
[编辑] 参数
s | - | 指向输出字符数组的指针 |
wc | - | 要转换的宽字符 |
[编辑] 返回值
如果 s 不是空指针,则返回 wc 的多字节表示形式中包含的字节数,或者如果 wc 不是有效字符,则返回 -1。
如果 s 是空指针,则将其内部转换状态重置为表示初始移位状态,如果当前多字节编码不是状态相关的(不使用移位序列),则返回 0,或者如果当前多字节编码是状态相关的(使用移位序列),则返回非零值。
[编辑] 备注
每次调用 wctomb
都会更新内部全局转换状态(一个类型为 std::mbstate_t 的静态对象,仅此函数知道)。如果多字节编码使用移位状态,则此函数不是可重入的。无论如何,多个线程不应在没有同步的情况下调用 wctomb
:可以改用 std::wcrtomb。
[编辑] 示例
运行此代码
#include <clocale> #include <cstdlib> #include <iomanip> #include <iostream> #include <string> void print_wide(const std::wstring& wstr) { bool shifts = std::wctomb(nullptr, 0); // reset the conversion state std::cout << "shift sequences are " << (shifts ? "" : "not" ) << " used\n" << std::uppercase << std::setfill('0'); for (const wchar_t wc : wstr) { std::string mb(MB_CUR_MAX, '\0'); const int ret = std::wctomb(&mb[0], wc); const char* s = ret > 1 ? "s" : ""; std::cout << "multibyte char '" << mb << "' is " << ret << " byte" << s << ": [" << std::hex; for (int i{0}; i != ret; ++i) { const int c = 0xFF & mb[i]; std::cout << (i ? " " : "") << std::setw(2) << c; } std::cout << "]\n" << std::dec; } } int main() { std::setlocale(LC_ALL, "en_US.utf8"); // UTF-8 narrow multibyte encoding std::wstring wstr = L"z\u00df\u6c34\U0001d10b"; // or L"zß水𝄋" print_wide(wstr); }
输出
shift sequences are not used multibyte char 'z' is 1 byte: [7A] multibyte char 'ß' is 2 bytes: [C3 9F] multibyte char '水' is 3 bytes: [E6 B0 B4] multibyte char '𝄋' is 4 bytes: [F0 9D 84 8B]
[编辑] 另请参见
将下一个多字节字符转换为宽字符 (函数) | |
将宽字符转换为其多字节表示形式,给定状态 (函数) | |
[虚拟] |
将字符串从 InternT 转换为 ExternT ,例如写入文件时( std::codecvt<InternT,ExternT,StateT> 的虚拟受保护成员函数) |
C 文档 for wctomb
|