std::mbrlen
来自 cppreference.com
定义在头文件 <cwchar> 中 |
||
std::size_t mbrlen( const char* s, std::size_t n, std::mbstate_t* ps); |
||
确定以 s 指向的第一个字节开头的多字节字符的剩余部分的大小(以字节为单位),前提是当前转换状态为 ps.
此函数等效于调用 std::mbrtowc(nullptr, s, n, ps ? ps : &internal),其中 internal 是类型为 std::mbstate_t 的某个隐藏对象,只是表达式 ps 仅计算一次。
内容 |
[编辑] 参数
s | - | 指向多字节字符字符串元素的指针 |
n | - | 可以检查的 s 中字节数限制 |
ps | - | 指向保存转换状态的变量的指针 |
[编辑] 返回值
- 0 如果下一个 n 个或更少的字节完成了空字符。
- 完成有效多字节字符的字节数(在 1 到 n 之间)。
- std::size_t(-1) 如果发生编码错误。
- std::size_t(-2) 如果下一个 n 个字节是可能有效的多字节字符的一部分,在检查完所有 n 个字节后仍然不完整。
[编辑] 示例
运行这段代码
#include <clocale> #include <cwchar> #include <iostream> #include <string> int main() { // allow mbrlen() to work with UTF-8 multibyte encoding std::setlocale(LC_ALL, "en_US.utf8"); // UTF-8 narrow multibyte encoding std::string str = "水"; // or u8"\u6c34" or "\xe6\xb0\xb4" std::mbstate_t mb = std::mbstate_t(); // simple use: length of a complete multibyte character const std::size_t len = std::mbrlen(&str[0], str.size(), &mb); std::cout << "The length of " << str << " is " << len << " bytes\n"; // advanced use: restarting in the middle of a multibyte character const std::size_t len1 = std::mbrlen(&str[0], 1, &mb); if (len1 == std::size_t(-2)) std::cout << "The first 1 byte of " << str << " is an incomplete multibyte char (mbrlen returns -2)\n"; const std::size_t len2 = std::mbrlen(&str[1], str.size() - 1, &mb); std::cout << "The remaining " << str.size() - 1 << " bytes of " << str << " hold " << len2 << " bytes of the multibyte character\n"; // error case: std::cout << "Attempting to call mbrlen() in the middle of " << str << " while in initial shift state returns " << (int)mbrlen(&str[1], str.size(), &mb) << '\n'; }
输出
The length of 水 is 3 bytes. The first 1 byte of 水 is an incomplete multibyte char (mbrlen returns -2) The remaining 2 bytes of 水 hold 2 bytes of the multibyte character Attempting to call mbrlen() in the middle of 水 while in initial shift state returns -1
[编辑] 参见
在给定状态下将下一个多字节字符转换为宽字符 (函数) | |
返回下一个多字节字符中的字节数 (函数) | |
[虚拟] |
计算将 ExternT 字符串转换为给定 InternT 缓冲区所需的字节数( std::codecvt<InternT,ExternT,StateT> 的虚拟受保护成员函数) |
C 文档 关于 mbrlen 的内容
|