C++标准库也提供了字符转换的工具:
但是只要要求可以实现以下几种转换,需要注意的事这些都是针对std::codecvt的特例化版本.
std::codecvt<char, char, std::mbstate_t> : 该版本的一般用于 UTF-8和ASCII(8bit)之间的转换.
std::codecvt<char16_t, char, std::mbstate_t>: 该版本的一般用于 UTF-16和UTF-8之间的转换.
std::codecvt<char32_t, char, std::mbstate_t>: 该版本的一般用于 UTF32和UTF-8之间的转换.
std::codecvt<wchar_t, char, std::mbstate_t>: 该版本的一般用于当前系统原生的wchar_t字符集和多字节字符集(multibyte characterset)之间的转换.
std::codecvt是依赖std::locale的,如果你使用的当前标准库有实现对对扩展字符集(Extented UNIX Code)的支持那么我们可以很容易使用std::codecvt转换进行 Unicode字符集和扩展字符集之间的转换.
在此之前我们需要了解一个 trivial-class:std::mbstate_t这个类很特殊,例如----采用multibyte编码的时候,在这种情况下在处理一个字符的时候,可能由于“源缓冲区”已经空了,或者目标缓冲区满了造成multibyte字符处理中断。如果这种情况出现将当前转换状态存储到此类对象内.
在了解std::codecvt之前我们需要再明确一个概念:
源缓冲区: 存储需要被转换的字符的区域.
目标缓冲区:存储已经被转换的字符的区域.
当从 wchar_t到char的时候:
会将每个wchar_t切割为 sizeof(wchar_t)个char对象.
当从char到wchar_t的时候:
会用sizeof(wchar_t)个char组装成一个char.
因此无论是下面的in()操作还是out()操作都只是切割或者组装操作,并不是到直接的把一个其他字符集的字符映射到当前字符集(反之亦然).
其中有几个函数返回值为:
std::co