C++/codecvt
外觀
< C++
codecvt 是C++標準程式庫中的一個頭文件,定義了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;
}