std:: wctomb
|
定义于头文件
<cstdlib>
|
||
|
int
wctomb
(
char
*
s,
wchar_t
wc
)
;
|
||
将宽字符 wc 转换为多字节编码,并将其(包括任何移位序列)存储到由 s 指向首元素的字符数组中。最多存储 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); // 重置转换状态 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 窄多字节编码 std::wstring wstr = L"z\u00df\u6c34\U0001d10b"; // 或 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]
参见
|
将下一个多字节字符转换为宽字符
(函数) |
|
|
在给定状态下将宽字符转换为其多字节表示形式
(函数) |
|
|
[virtual]
|
将字符串从
InternT
转换为
ExternT
,例如写入文件时
(
std::codecvt<InternT,ExternT,StateT>
的虚受保护成员函数)
|
|
C 文档
关于
wctomb
|
|