名稱空間
變體
操作

std::codecvt

來自 cppreference.com
< cpp‎ | locale
 
 
 
 
 
定義於標頭檔案 <locale>
template<

    class InternT,
    class ExternT,
    class StateT

> class codecvt;

類模板 std::codecvt 封裝了字元字串(包括寬字元和多位元組字元)從一種編碼到另一種編碼的轉換。所有透過 std::basic_fstream<CharT> 執行的檔案 I/O 操作都使用流中注入的 locale 的 std::codecvt<CharT, char, std::mbstate_t> facet。

cpp/locale/codecvt basecpp/locale/locale/facetstd-codecvt-inheritance.svg

繼承圖

目錄

[編輯] 特化

標準庫保證提供以下特化(它們 要求由任何區域設定物件實現

定義於標頭檔案 <locale>
std::codecvt<char, char, std::mbstate_t> 同類型轉換
std::codecvt<char16_t, char, std::mbstate_t>
(C++11 起)(C++20 起棄用)
UTF-16 和 UTF-8 之間的轉換
std::codecvt<char16_t, char8_t, std::mbstate_t>
(C++20 起)(已棄用)
UTF-16 和 UTF-8 之間的轉換
std::codecvt<char32_t, char, std::mbstate_t>
(C++11 起)(C++20 起棄用)
UTF-32 和 UTF-8 之間的轉換
std::codecvt<char32_t, char8_t, std::mbstate_t>
(C++20 起)(已棄用)
UTF-32 和 UTF-8 之間的轉換
std::codecvt<wchar_t, char, std::mbstate_t> 系統原生寬字元集和單位元組窄字元集之間的轉換

[編輯] 巢狀型別

型別 定義
intern_type InternT
extern_type ExternT
state_type StateT

[編輯] 資料成員

成員 描述
std::locale::id id [靜態] facet 的識別符號

[編輯] 成員函式

構造新的 codecvt facet
(公開成員函式)
呼叫 do_out
(公有成員函式) [編輯]
呼叫 do_in
(公有成員函式) [編輯]
呼叫 do_unshift
(公有成員函式) [編輯]
呼叫 do_encoding
(公有成員函式) [編輯]
呼叫 do_always_noconv
(公有成員函式) [編輯]
呼叫 do_length
(公有成員函式) [編輯]
呼叫 do_max_length
(公有成員函式) [編輯]

[編輯] 受保護成員函式

銷燬 codecvt facet
(受保護成員函式)
[虛擬函式]
將字串從 InternT 轉換為 ExternT,例如寫入檔案時
(虛保護成員函式) [編輯]
[虛擬函式]
將字串從 ExternT 轉換為 InternT,例如從檔案讀取時
(虛保護成員函式) [編輯]
[虛擬函式]
為不完整的轉換生成 ExternT 字元的終止字元序列
(虛保護成員函式) [編輯]
[虛擬函式]
返回生成一個 InternT 字元所需的 ExternT 字元數(如果恆定)
(虛保護成員函式) [編輯]
[虛擬函式]
測試 facet 是否為所有有效引數值編碼同一性轉換
(虛保護成員函式) [編輯]
[虛擬函式]
計算轉換為給定 InternT 緩衝區時將消耗的 ExternT 字串的長度
(虛保護成員函式) [編輯]
[虛擬函式]
返回可以轉換為單個 InternT 字元的最大 ExternT 字元數
(虛保護成員函式) [編輯]

繼承自 std::codecvt_base

巢狀型別 定義
enum result { ok, partial, error, noconv }; 無作用域列舉型別
列舉常量 定義
ok 轉換完成,無錯誤
部分 並非所有源字元都已轉換
error 遇到無效字元
noconv 無需轉換,輸入和輸出型別相同

[編輯] 示例

以下示例使用在 codecvt<wchar_t, char, std::mbstate_t> 中實現 UTF-8 轉換的 locale 讀取 UTF-8 檔案,並使用 std::codecvt 的標準特化之一將 UTF-8 字串轉換為 UTF-16。

#include <codecvt>
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
 
// utility wrapper to adapt locale-bound facets for wstring/wbuffer convert
template<class Facet>
struct deletable_facet : Facet
{
    template<class... Args>
    deletable_facet(Args&&... args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};
 
int main()
{
    // UTF-8 narrow multibyte encoding
    std::string data = reinterpret_cast<const char*>(+u8"z\u00df\u6c34\U0001f34c");
                       // or reinterpret_cast<const char*>(+u8"zß水🍌")
                       // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"
 
    std::ofstream("text.txt") << data;
 
    // using system-supplied locale's codecvt facet
    std::wifstream fin("text.txt");
    // reading from wifstream will use codecvt<wchar_t, char, std::mbstate_t>
    // this locale's codecvt converts UTF-8 to UCS4 (on systems such as Linux)
    fin.imbue(std::locale("en_US.UTF-8"));
    std::cout << "The UTF-8 file contains the following UCS4 code units:\n" << std::hex;
    for (wchar_t c; fin >> c;)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint32_t>(c) << ' ';
 
    // using standard (locale-independent) codecvt facet
    std::wstring_convert<
        deletable_facet<std::codecvt<char16_t, char, std::mbstate_t>>, char16_t> conv16;
    std::u16string str16 = conv16.from_bytes(data);
 
    std::cout << "\n\nThe UTF-8 file contains the following UTF-16 code units:\n"
              << std::hex;
    for (char16_t c : str16)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint16_t>(c) << ' ';
    std::cout << '\n';
}

輸出

The UTF-8 file contains the following UCS4 code units:
U+007a U+00df U+6c34 U+1f34c 
 
The UTF-8 file contains the following UTF-16 code units:
U+007a U+00df U+6c34 U+d83c U+df4c

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3767 C++20 std::codecvt<char16_t, char8_t, std::mbstate_t>
std::codecvt<char32_t, char8_t, std::mbstate_t> 是與 locale 無關的
棄用它們

[編輯] 參閱

字元
轉換
由區域設定定義的多位元組
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (帶 C11 的 DR488)

codecvt<char16_t,char,mbstate_t>
codecvt_utf8_utf16<char16_t>
codecvt_utf8_utf16<char32_t>
codecvt_utf8_utf16<wchar_t>

N/A
UCS-2 c16rtomb (不帶 C11 的 DR488) codecvt_utf8<char16_t> codecvt_utf16<char16_t>
UTF-32

mbrtoc32 / c32rtomb

codecvt<char32_t,char,mbstate_t>
codecvt_utf8<char32_t>

codecvt_utf16<char32_t>

系統 wchar_t

UTF-32 (非 Windows)
UCS-2 (Windows)

mbsrtowcs / wcsrtombs
use_facet<codecvt
<wchar_t,char,mbstate_t>>(locale)

codecvt_utf8<wchar_t> codecvt_utf16<wchar_t>
定義字元轉換錯誤
(類) [編輯]
表示指定 locale 的系統提供的 std::codecvt
(類模板) [編輯]
(C++11)(C++17 中已棄用)(C++26 中已移除)
在 UTF-8 和 UCS-2/UCS-4 之間轉換
(類模板) [編輯]
(C++11)(C++17 中已棄用)(C++26 中已移除)
在 UTF-16 和 UCS-2/UCS-4 之間轉換
(類模板) [編輯]
(C++11)(C++17 中已棄用)(C++26 中已移除)
在 UTF-8 和 UTF-16 之間轉換
(類模板) [編輯]