跳至內容

C++/codecvt

維基教科書,自由的教學讀本
< C++

codecvtC++標準程式庫中的一個頭文件,定義了C++標準中的字符編碼轉化的幾個基本模板類。

這個頭文件主要包含 std::codecvt 類模板及其特化,支持字符編碼之間的轉換,例如從UTF-8 到 UTF-16,或從寬字符(wchar_t)到窄字符(char)等。std::codecvt 類通常與 std::wstring_convert 類一起使用,以實現字符編碼轉換。

語法 codecvt 命名空間中的主要類和函數如下:

codecvt_base:定義了編碼轉換的狀態類型和錯誤處理方式。 codecvt_byname:模板類,用於創建特定編碼的轉換器。 codecvt_utf8、codecvt_utf16:特定編碼的轉換器類。


std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; std::wstring wide_string = converter.from_bytes("Hello, World!"); std::string narrow_string = converter.to_bytes(L"你好,世界!");

類模板

[編輯]

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("c:\\temp\\text.txt") << u8"\ufeffz\u6c34\U000200fa";  // including latin small letter 'z' U+007a   CJK ideograph "水"
	// read the UTF8 file, skipping the BOM
	std::wifstream fin("c:\\temp\\text.txt");
	fin.imbue(std::locale(fin.getloc(),
		new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>)); //std::codecvt_utf8 是一个模板类,提供了从 UTF-8 编码到其他字符类型(如 wchar_t)的转换支持。
                                       // 采取的有效的Unicode字符集的最大值0x10ffff,即所有合法的 Unicode 字符都能被表示。
                                       // std::consume_header 表示在进行编码转换时,如果存在 BOM(字节顺序标记),则会将其消费掉(即忽略 BOM),而不会将其作为字符输出。
    std::cout << "Read from file using UTF-8/UCS2 codecvt\n";
	for (wchar_t c; fin.get(c); )
		std::wcout << std::hex << std::showbase << static_cast<unsigned short>(c) << '\n';
/* 输出为:
0x7a
0x6c34
0xfa  */
             
    std::wifstream fin1("c:\\temp\\text.txt");
    fin1.imbue(std::locale(fin1.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
    std::cout << "Read from file using UTF-8/UTF-16 codecvt\n";
    
    for (wchar_t c; fin1 >> c; )
        std::wcout << std::hex << std::showbase << static_cast<unsigned short>(c) << '\n';
/* 输出为:
0x7a
0x6c34
0xd840
0xdcfa
*/
	return 0;
}

參考文獻

[編輯]