跳转到内容

C++/codecvt

维基教科书,自由的教学读本
< C++

codecvtC++标准程式库中的一个头文件,定义了C++标准中的字符编码转化的几个基本模板类。

类模板

[编辑]

codecvt_utf8

[编辑]
template<
    class Elem,
    unsigned long Maxcode = 0x10ffff,
    std::codecvt_mode Mode = (std::codecvt_mode)0
> class codecvt_utf8 : public std::codecvt<Elem, char, std::mbstate_t>;

用于UTF-8编码的字节串 向/从 char16_t, char32_t, wchar_t的等宽字符串转化。可用于UTF-8编码的文件的读写,无论文本模式或二进制模式。

codecvt_utf16

[编辑]

UTF-16与UCS2/UCS4等宽字符集之间的编码转化。

codecvt_utf8_utf16

[编辑]

UTF-8与UTF-16之间的编码转化。

枚举型

[编辑]
enum codecvt_mode {
    consume_header = 4,
    generate_header = 2,
    little_endian = 1
};

使用

[编辑]

通常使用类模板std::wstring_convert来实现各种宽字符与窄字符之间的转换。例如:

#include <iostream>
#include <locale>
#include <string>
#include <codecvt>

int main ()
{
  std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> conversion;
  std::string mbs = conversion.to_bytes( u"\u4f60\u597d" );  
 
  std::cout << std::hex;
  for (int i=0; i<mbs.length(); ++i)
    std::cout << int(unsigned char(mbs[i])) << ' ';
  std::cout << '\n';

  return 0;
}

下面例子对文件流做utf8到宽字符转换:

 
#include <fstream>
#include <iostream> 
#include <locale>
#include <codecvt>
#include <iosfwd> 
int main()
{
	// UTF-8 data with BOM
	std::ofstream("text.txt") << u8"\ufeffz\u6c34\U000200fa";
	// read the UTF8 file, skipping the BOM
	std::wifstream fin("text.txt");
	fin.imbue(std::locale(fin.getloc(),
		new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>));
	for (wchar_t c; fin.get(c); )
		std::cout << std::hex << std::showbase << c << '\n';

	return 0;
}

参考文献

[编辑]