std::mbrtoc32
性病:Mbrtoc 32
Defined in header | | |
---|---|---|
std::size_t mbrtoc32( char32_t* pc32, const char* s, std::size_t n, std::mbstate_t* ps | | (since C++11) |
将窄多字节字符转换为其UTF-32字符表示形式。
如果s
不是空指针,最多检查n
多字节字符串的字节,以s
若要确定完成下一个多字节字符%28(包括任何移位序列%29)所需的字节数,请执行以下操作。中的下一个多字节字符。s
为完整和有效,则将其转换为相应的32位字符并将其存储在*pc32
%28pc32
不是空%29。
中的多字节字符*s
对应于多字符32[医]T序列%28不可能在UTF-32%29中完成,然后在第一次调用该函数之后,*ps
的更新方式,以便下一次调用mbrtoc32
将写出额外的字符32[医]T,不考虑*s
...
如果s
为空指针,其值为n
和pc32
被忽略,并且调用等效于std::mbrtoc32(
NULL
, "", 1, ps)
...
如果生成的宽字符为空字符,则为转换状态。*ps
表示初始移位状态。
此函数使用的多字节编码由当前活动的C语言环境指定。
参数
pc32 | - | pointer to the location where the resulting 32-bit character will be written |
---|---|---|
s | - | pointer to the multibyte character string used as input |
n | - | limit on the number of bytes in s that can be examined |
ps | - | pointer to the conversion state object used when interpreting the multibyte string |
返回值
适用的第一条规定如下:
0
如果字符转换为s
%28并储存在*pc32
如果非空%29是空字符。
- 字节数
[1...n]
成功转换的多字节字符的s
-3
如果下一个char32_t
从多个-char32_t
字符已经写到*pc32
在这种情况下,不处理输入中的字节。
-2
如果下一个n
字节构成一个不完整的,但迄今为止有效的多字节字符。什么都没有写到*pc32
...
-1
如果出现编码错误。什么都没有写到*pc32
,价值EILSEQ
存储在errno
以及如果*ps
没有具体说明。
实例
二次
#include <iostream>
#include <iomanip>
#include <clocale>
#include <cstring>
#include <cwchar>
#include <cuchar>
#include <cassert>
int main()
{
std::setlocale(LC_ALL, "en_US.utf8"
std::string str = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水?"
std::cout << "Processing " << str.size() << " bytes: [ " << std::showbase;
for(unsigned char c: str) std::cout << std::hex << +c << ' ';
std::cout << "]\n";
std::mbstate_t state{}; // zero-initialized to initial state
char32_t c32;
const char *ptr = str.c_str(), *end = str.c_str() + str.size() + 1;
while(int rc = std::mbrtoc32(&c32, ptr, end - ptr, &state))
{
std::cout << "Next UTF-32 char: " << std::hex << c32 << " obtained from ";
assert(rc != -3 // no surrogates in UTF-32
if(rc > 0) {
std::cout << std::dec << rc << " bytes [ ";
for(int n = 0; n < rc; ++n)
std::cout << std::hex << +(unsigned char)ptr[n] << ' ';
std::cout << "]\n";
ptr += rc;
} else break;
}
}
二次
产出:
二次
Processing 10 bytes: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c ]
Next UTF-32 char: 0x7a obtained from 1 bytes [ 0x7a ]
Next UTF-32 char: 0xdf obtained from 2 bytes [ 0xc3 0x9f ]
Next UTF-32 char: 0x6c34 obtained from 3 bytes [ 0xe6 0xb0 0xb4 ]
Next UTF-32 char: 0x1f34c obtained from 4 bytes [ 0xf0 0x9f 0x8d 0x8c ]
二次
另见
c32rtomb (C++11) | convert a 32-bit wide character to narrow multibyte string (function) |
---|---|
do_in virtual | converts a string from externT to internT, such as when reading from file (virtual protected member function of std::codecvt) |
c mbrtoc 32的文件
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。