[text.encoding]

# 28 Text processing library [[text]](./#text)

## 28.4 Text encodings identification [text.encoding]

### [28.4.1](#syn) Header <text_encoding> synopsis [[text.encoding.syn]](text.encoding.syn)

[ð](#header:%3ctext_encoding%3e)

namespace std {struct text_encoding; // [[text.encoding.hash]](#hash "28.4.2.7 Hash support"), hash supporttemplate<class T> struct hash; template<> struct hash<text_encoding>;}

### [28.4.2](#class) Class text_encoding [[text.encoding.class]](text.encoding.class)

#### [28.4.2.1](#overview) Overview [[text.encoding.overview]](text.encoding.overview)

[1](#overview-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5014)

The class text_encoding describes an interface
for accessing the IANA Character Sets registry[[bib]](bibliography#bib:iana-charset "Bibliography")[.](#overview-1.sentence-1)

[ð](#lib:text_encoding)

namespace std {struct text_encoding {static constexpr size_t max_name_length = 63; // [[text.encoding.id]](#id "28.4.2.6 Enumeration text_­encoding​::​id"), enumeration text_encoding​::​idenum class id : int_least32_t {*see below*}; using enum id; constexpr text_encoding() = default; constexpr explicit text_encoding(string_view enc) noexcept; constexpr text_encoding(id i) noexcept; constexpr id mib() const noexcept; constexpr const char* name() const noexcept; // [[text.encoding.aliases]](#aliases "28.4.2.5 Class text_­encoding​::​aliases_­view"), class text_encoding​::​aliases_viewstruct aliases_view; constexpr aliases_view aliases() const noexcept; friend constexpr bool operator==(const text_encoding& a, const text_encoding& b) noexcept; friend constexpr bool operator==(const text_encoding& encoding, id i) noexcept; static consteval text_encoding literal() noexcept; static text_encoding environment(); template<id i> static bool environment_is(); private: id *mib_* = id::unknown; // *exposition only*char *name_*[max_name_length + 1] = {0}; // *exposition only*static constexpr bool *comp-name*(string_view a, string_view b); // *exposition only*};}

[2](#overview-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5057)

Class text_encoding is
a trivially copyable type ([[basic.types.general]](basic.types.general#term.trivially.copyable.type "6.9.1 General"))[.](#overview-2.sentence-1)

#### [28.4.2.2](#general) General [[text.encoding.general]](text.encoding.general)

[1](#general-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5063)

A [*registered character encoding*](#def:encoding,registered_character "28.4.2.2 General [text.encoding.general]") is
a character encoding scheme in the IANA Character Sets registry[.](#general-1.sentence-1)

[*Note [1](#general-note-1)*:

The IANA Character Sets registry uses the term âcharacter setsâ
to refer to character encodings[.](#general-1.sentence-2)

â *end note*]

The primary name of a registered character encoding is
the name of that encoding specified in the IANA Character Sets registry[.](#general-1.sentence-3)

[2](#general-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5073)

The set of known registered character encodings contains
every registered character encoding
specified in the IANA Character Sets registry except for the following:

- [(2.1)](#general-2.1)

NATS-DANO (33)

- [(2.2)](#general-2.2)

NATS-DANO-ADD (34)

[3](#general-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5082)

Each known registered character encoding
is identified by an enumerator in text_encoding​::​id, and
has a set of zero or more [*aliases*](#def:encoding,registered_character,alias "28.4.2.2 General [text.encoding.general]")[.](#general-3.sentence-1)

[4](#general-4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5087)

The set of aliases of a known registered character encoding is animplementation-defined
superset of the aliases specified in the IANA Character Sets registry[.](#general-4.sentence-1)

The set of aliases for US-ASCII includes âASCIIâ[.](#general-4.sentence-2)

No two aliases or primary names of distinct registered character encodings
are equivalent when compared by text_encoding​::​*comp-name*[.](#general-4.sentence-3)

[5](#general-5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5095)

How a text_encoding object
is determined to be representative of a character encoding scheme
implemented in the translation or execution environment isimplementation-defined[.](#general-5.sentence-1)

[6](#general-6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5102)

An object e of type text_encoding such thate.mib() == text_encoding​::​id​::​unknown is false ande.mib() == text_encoding​::​id​::​other is false maintains the following invariants:

- [(6.1)](#general-6.1)

*e.name() == '\0' is false, and

- [(6.2)](#general-6.2)

e.mib() == text_encoding(e.name()).mib() is true[.](#general-6.sentence-1)

[7](#general-7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5112)

*Recommended practice*: 

- [(7.1)](#general-7.1)

  Implementations should not consider registered encodings to be interchangeable[.](#general-7.1.sentence-1)
  [*Example [1](#general-example-1)*:
  Shift_JIS and Windows-31J denote different encodings[.](#general-7.1.sentence-2)
 â *end example*]

- [(7.2)](#general-7.2)

  Implementations should not use the name of a registered encoding
to describe another similar yet different non-registered encoding
unless there is a precedent on that implementation[.](#general-7.2.sentence-1)
  [*Example [2](#general-example-2)*:
  Big5
 â *end example*]

#### [28.4.2.3](#members) Members [[text.encoding.members]](text.encoding.members)

[ð](#lib:text_encoding,constructor)

`constexpr explicit text_encoding(string_view enc) noexcept;
`

[1](#members-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5137)

*Preconditions*: 

- [(1.1)](#members-1.1)

  enc represents a string in the ordinary literal encoding
consisting only of elements of the basic character set ([[lex.charset]](lex.charset "5.3.1 Character sets"))[.](#members-1.1.sentence-1)

- [(1.2)](#members-1.2)

  enc.size() <= max_name_length is true[.](#members-1.2.sentence-1)

- [(1.3)](#members-1.3)

  enc.contains('\0') is false[.](#members-1.3.sentence-1)

[2](#members-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5149)

*Postconditions*: 

- [(2.1)](#members-2.1)

  If there exists a primary name or alias a of a known registered character encoding such that*comp-name*(a, enc) is true,*mib_* has the value of the enumerator of id associated with that registered character encoding[.](#members-2.1.sentence-1)
  Otherwise, *mib_* == id​::​other is true[.](#members-2.1.sentence-2)

- [(2.2)](#members-2.2)

  enc.compare(*name_*) == 0 is true[.](#members-2.2.sentence-1)

[ð](#lib:text_encoding,constructor_)

`constexpr text_encoding(id i) noexcept;
`

[3](#members-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5170)

*Preconditions*: i has the value of one of the enumerators of id[.](#members-3.sentence-1)

[4](#members-4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5174)

*Postconditions*: 

- [(4.1)](#members-4.1)

  *mib_* == i is true[.](#members-4.1.sentence-1)

- [(4.2)](#members-4.2)

  If (*mib_* == id​::​unknown || *mib_* == id​::​other) is true,strlen(*name_*) == 0 is true[.](#members-4.2.sentence-1)
  Otherwise,ranges​::​contains(aliases(), string_view(*name_*)) is true[.](#members-4.2.sentence-2)

[ð](#lib:mib,text_encoding)

`constexpr id mib() const noexcept;
`

[5](#members-5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5195)

*Returns*: *mib_*[.](#members-5.sentence-1)

[ð](#lib:name,text_encoding)

`constexpr const char* name() const noexcept;
`

[6](#members-6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5206)

*Returns*: *name_*[.](#members-6.sentence-1)

[7](#members-7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5210)

*Remarks*: name() is an ntbs and
accessing elements of *name_* outside of the range name()+[0, strlen(name()) + 1) is undefined behavior[.](#members-7.sentence-1)

[ð](#lib:aliases,text_encoding)

`constexpr aliases_view aliases() const noexcept;
`

Let r denote an instance of aliases_view[.](#members-sentence-1)

If *this represents a known registered character encoding, then:

- r.front() is the primary name of the registered character encoding,
- r contains the aliases of the registered character encoding, and
- r does not contain duplicate values when compared with strcmp[.](#members-sentence-2)

Otherwise, r is an empty range[.](#members-sentence-3)

[8](#members-8)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5236)

Each element in r is a non-null, non-empty ntbs encoded in the literal character encoding and
comprising only characters from the basic character set[.](#members-8.sentence-1)

[9](#members-9)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5241)

*Returns*: r[.](#members-9.sentence-1)

[10](#members-10)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5245)

[*Note [1](#members-note-1)*:

The order of aliases in r is unspecified[.](#members-10.sentence-1)

â *end note*]

[ð](#lib:literal,text_encoding)

`static consteval text_encoding literal() noexcept;
`

[11](#members-11)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5257)

*Mandates*: CHAR_BIT == 8 is true[.](#members-11.sentence-1)

[12](#members-12)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5261)

*Returns*: A text_encoding object representing
the ordinary character literal encoding ([[lex.charset]](lex.charset "5.3.1 Character sets"))[.](#members-12.sentence-1)

[ð](#lib:environment,text_encoding)

`static text_encoding environment();
`

[13](#members-13)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5273)

*Mandates*: CHAR_BIT == 8 is true[.](#members-13.sentence-1)

[14](#members-14)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5277)

*Returns*: A text_encoding object representing
the implementation-defined
character encoding scheme of the environment[.](#members-14.sentence-1)

On a POSIX implementation, this is the encoding scheme associated with
the POSIX locale denoted by the empty string ""[.](#members-14.sentence-2)

[15](#members-15)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5285)

[*Note [2](#members-note-2)*:

This function is not affected by calls to setlocale[.](#members-15.sentence-1)

â *end note*]

[16](#members-16)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5290)

*Recommended practice*: Implementations should return a value that is not affected by calls to
the POSIX function setenv and
other functions which can modify the environment ([[support.runtime]](support.runtime "17.14 Other runtime support"))[.](#members-16.sentence-1)

[ð](#lib:environment_is,text_encoding)

`template<id i>
  static bool environment_is();
`

[17](#members-17)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5304)

*Mandates*: CHAR_BIT == 8 is true[.](#members-17.sentence-1)

[18](#members-18)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5308)

*Returns*: environment() == i[.](#members-18.sentence-1)

[ð](#lib:comp-name,text_encoding)

`static constexpr bool comp-name(string_view a, string_view b);
`

[19](#members-19)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5319)

*Returns*: true if the two strings a and b encoded in the ordinary literal encoding
are equal, ignoring, from left-to-right,

- [(19.1)](#members-19.1)

all elements that are not digits or letters ([[character.seq.general]](character.seq.general "16.3.3.3.4.1 General")),

- [(19.2)](#members-19.2)

character case, and

- [(19.3)](#members-19.3)

any sequence of one or more 0 characters
not immediately preceded by a numeric prefix, where
a numeric prefix is a sequence consisting of
a digit in the range [1, 9]
optionally followed by one or more elements which are not digits or letters,

and false otherwise[.](#members-19.sentence-1)

[*Note [3](#members-note-3)*:

This comparison is identical to
the âCharset Alias Matchingâ algorithm
described in the Unicode Technical Standard 22[[bib]](bibliography#bib:unicode-charmap "Bibliography")[.](#members-19.sentence-2)

â *end note*]

[*Example [1](#members-example-1)*: static_assert(*comp-name*("UTF-8", "utf8") == true);static_assert(*comp-name*("u.t.f-008", "utf8") == true);static_assert(*comp-name*("ut8", "utf8") == false);static_assert(*comp-name*("utf-80", "utf8") == false); â *end example*]

#### [28.4.2.4](#cmp) Comparison functions [[text.encoding.cmp]](text.encoding.cmp)

[ð](#lib:operator==,text_encoding)

`friend constexpr bool operator==(const text_encoding& a, const text_encoding& b) noexcept;
`

[1](#cmp-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5362)

*Returns*: If a.*mib_* == id​::​other && b.*mib_* == id​::​other is true,
then *comp-name*(a.*name_*,  
b.*name_*)[.](#cmp-1.sentence-1)

Otherwise, a.*mib_* == b.*mib_*[.](#cmp-1.sentence-2)

[ð](#lib:operator==,text_encoding_)

`friend constexpr bool operator==(const text_encoding& encoding, id i) noexcept;
`

[2](#cmp-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5376)

*Returns*: encoding.*mib_* == i[.](#cmp-2.sentence-1)

[3](#cmp-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5380)

*Remarks*: This operator induces an equivalence relation on its arguments
if and only if i != id​::​other is true[.](#cmp-3.sentence-1)

#### [28.4.2.5](#aliases) Class text_encoding​::​aliases_view [[text.encoding.aliases]](text.encoding.aliases)

[ð](#lib:aliases_view,text_encoding)

`struct text_encoding::aliases_view : ranges::view_interface<text_encoding::aliases_view> {
  constexpr implementation-defined begin() const;
  constexpr implementation-defined end() const;
};
`

[1](#aliases-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5399)

text_encoding​::​aliases_view models[copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]"),ranges​::​[view](range.view#concept:view "25.4.5 Views [range.view]"),ranges​::​[random_access_range](range.refinements#concept:random_access_range "25.4.6 Other range refinements [range.refinements]"), andranges​::​[borrowed_range](range.range#concept:borrowed_range "25.4.2 Ranges [range.range]")[.](#aliases-1.sentence-1)

[*Note [1](#aliases-note-1)*:

text_encoding​::​aliases_view is not required to satisfyranges​::​[common_range](range.refinements#concept:common_range "25.4.6 Other range refinements [range.refinements]"),
nor [default_initializable](concept.default.init#concept:default_initializable "18.4.12 Concept default_­initializable [concept.default.init]")[.](#aliases-1.sentence-2)

â *end note*]

[2](#aliases-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5411)

Bothranges​::​range_value_t<text_encoding​::​aliases_view> andranges​::​range_reference_t<text_encoding​::​aliases_view> denote const char*[.](#aliases-2.sentence-1)

[3](#aliases-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5417)

ranges​::​iterator_t<text_encoding​::​aliases_view> is a constexpr iterator ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General"))[.](#aliases-3.sentence-1)

#### [28.4.2.6](#id) Enumeration text_encoding​::​id [[text.encoding.id]](text.encoding.id)

[ð](#lib:id,text_encoding)

namespace std {enum class text_encoding::id : int_least32_t { other = 1,
 unknown = 2,
 ASCII = 3,
 ISOLatin1 = 4,
 ISOLatin2 = 5,
 ISOLatin3 = 6,
 ISOLatin4 = 7,
 ISOLatinCyrillic = 8,
 ISOLatinArabic = 9,
 ISOLatinGreek = 10,
 ISOLatinHebrew = 11,
 ISOLatin5 = 12,
 ISOLatin6 = 13,
 ISOTextComm = 14,
 HalfWidthKatakana = 15,
 JISEncoding = 16,
 ShiftJIS = 17,
 EUCPkdFmtJapanese = 18,
 EUCFixWidJapanese = 19,
 ISO4UnitedKingdom = 20,
 ISO11SwedishForNames = 21,
 ISO15Italian = 22,
 ISO17Spanish = 23,
 ISO21German = 24,
 ISO60DanishNorwegian = 25,
 ISO69French = 26,
 ISO10646UTF1 = 27,
 ISO646basic1983 = 28,
 INVARIANT = 29,
 ISO2IntlRefVersion = 30,
 NATSSEFI = 31,
 NATSSEFIADD = 32,
 ISO10Swedish = 35,
 KSC56011987 = 36,
 ISO2022KR = 37,
 EUCKR = 38,
 ISO2022JP = 39,
 ISO2022JP2 = 40,
 ISO13JISC6220jp = 41,
 ISO14JISC6220ro = 42,
 ISO16Portuguese = 43,
 ISO18Greek7Old = 44,
 ISO19LatinGreek = 45,
 ISO25French = 46,
 ISO27LatinGreek1 = 47,
 ISO5427Cyrillic = 48,
 ISO42JISC62261978 = 49,
 ISO47BSViewdata = 50,
 ISO49INIS = 51,
 ISO50INIS8 = 52,
 ISO51INISCyrillic = 53,
 ISO54271981 = 54,
 ISO5428Greek = 55,
 ISO57GB1988 = 56,
 ISO58GB231280 = 57,
 ISO61Norwegian2 = 58,
 ISO70VideotexSupp1 = 59,
 ISO84Portuguese2 = 60,
 ISO85Spanish2 = 61,
 ISO86Hungarian = 62,
 ISO87JISX0208 = 63,
 ISO88Greek7 = 64,
 ISO89ASMO449 = 65,
 ISO90 = 66,
 ISO91JISC62291984a = 67,
 ISO92JISC62991984b = 68,
 ISO93JIS62291984badd = 69,
 ISO94JIS62291984hand = 70,
 ISO95JIS62291984handadd = 71,
 ISO96JISC62291984kana = 72,
 ISO2033 = 73,
 ISO99NAPLPS = 74,
 ISO102T617bit = 75,
 ISO103T618bit = 76,
 ISO111ECMACyrillic = 77,
 ISO121Canadian1 = 78,
 ISO122Canadian2 = 79,
 ISO123CSAZ24341985gr = 80,
 ISO88596E = 81,
 ISO88596I = 82,
 ISO128T101G2 = 83,
 ISO88598E = 84,
 ISO88598I = 85,
 ISO139CSN369103 = 86,
 ISO141JUSIB1002 = 87,
 ISO143IECP271 = 88,
 ISO146Serbian = 89,
 ISO147Macedonian = 90,
 ISO150 = 91,
 ISO151Cuba = 92,
 ISO6937Add = 93,
 ISO153GOST1976874 = 94,
 ISO8859Supp = 95,
 ISO10367Box = 96,
 ISO158Lap = 97,
 ISO159JISX02121990 = 98,
 ISO646Danish = 99,
 USDK = 100,
 DKUS = 101,
 KSC5636 = 102,
 Unicode11UTF7 = 103,
 ISO2022CN = 104,
 ISO2022CNEXT = 105,
 UTF8 = 106,
 ISO885913 = 109,
 ISO885914 = 110,
 ISO885915 = 111,
 ISO885916 = 112,
 GBK = 113,
 GB18030 = 114,
 OSDEBCDICDF0415 = 115,
 OSDEBCDICDF03IRV = 116,
 OSDEBCDICDF041 = 117,
 ISO115481 = 118,
 KZ1048 = 119,
 UCS2 = 1000,
 UCS4 = 1001,
 UnicodeASCII = 1002,
 UnicodeLatin1 = 1003,
 UnicodeJapanese = 1004,
 UnicodeIBM1261 = 1005,
 UnicodeIBM1268 = 1006,
 UnicodeIBM1276 = 1007,
 UnicodeIBM1264 = 1008,
 UnicodeIBM1265 = 1009,
 Unicode11 = 1010,
 SCSU = 1011,
 UTF7 = 1012,
 UTF16BE = 1013,
 UTF16LE = 1014,
 UTF16 = 1015,
 CESU8 = 1016,
 UTF32 = 1017,
 UTF32BE = 1018,
 UTF32LE = 1019,
 BOCU1 = 1020,
 UTF7IMAP = 1021,
 Windows30Latin1 = 2000,
 Windows31Latin1 = 2001,
 Windows31Latin2 = 2002,
 Windows31Latin5 = 2003,
 HPRoman8 = 2004,
 AdobeStandardEncoding = 2005,
 VenturaUS = 2006,
 VenturaInternational = 2007,
 DECMCS = 2008,
 PC850Multilingual = 2009,
 PCp852 = 2010,
 PC8CodePage437 = 2011,
 PC8DanishNorwegian = 2012,
 PC862LatinHebrew = 2013,
 PC8Turkish = 2014,
 IBMSymbols = 2015,
 IBMThai = 2016,
 HPLegal = 2017,
 HPPiFont = 2018,
 HPMath8 = 2019,
 HPPSMath = 2020,
 HPDesktop = 2021,
 VenturaMath = 2022,
 MicrosoftPublishing = 2023,
 Windows31J = 2024,
 GB2312 = 2025,
 Big5 = 2026,
 Macintosh = 2027,
 IBM037 = 2028,
 IBM038 = 2029,
 IBM273 = 2030,
 IBM274 = 2031,
 IBM275 = 2032,
 IBM277 = 2033,
 IBM278 = 2034,
 IBM280 = 2035,
 IBM281 = 2036,
 IBM284 = 2037,
 IBM285 = 2038,
 IBM290 = 2039,
 IBM297 = 2040,
 IBM420 = 2041,
 IBM423 = 2042,
 IBM424 = 2043,
 IBM500 = 2044,
 IBM851 = 2045,
 IBM855 = 2046,
 IBM857 = 2047,
 IBM860 = 2048,
 IBM861 = 2049,
 IBM863 = 2050,
 IBM864 = 2051,
 IBM865 = 2052,
 IBM868 = 2053,
 IBM869 = 2054,
 IBM870 = 2055,
 IBM871 = 2056,
 IBM880 = 2057,
 IBM891 = 2058,
 IBM903 = 2059,
 IBM904 = 2060,
 IBM905 = 2061,
 IBM918 = 2062,
 IBM1026 = 2063,
 IBMEBCDICATDE = 2064,
 EBCDICATDEA = 2065,
 EBCDICCAFR = 2066,
 EBCDICDKNO = 2067,
 EBCDICDKNOA = 2068,
 EBCDICFISE = 2069,
 EBCDICFISEA = 2070,
 EBCDICFR = 2071,
 EBCDICIT = 2072,
 EBCDICPT = 2073,
 EBCDICES = 2074,
 EBCDICESA = 2075,
 EBCDICESS = 2076,
 EBCDICUK = 2077,
 EBCDICUS = 2078,
 Unknown8BiT = 2079,
 Mnemonic = 2080,
 Mnem = 2081,
 VISCII = 2082,
 VIQR = 2083,
 KOI8R = 2084,
 HZGB2312 = 2085,
 IBM866 = 2086,
 PC775Baltic = 2087,
 KOI8U = 2088,
 IBM00858 = 2089,
 IBM00924 = 2090,
 IBM01140 = 2091,
 IBM01141 = 2092,
 IBM01142 = 2093,
 IBM01143 = 2094,
 IBM01144 = 2095,
 IBM01145 = 2096,
 IBM01146 = 2097,
 IBM01147 = 2098,
 IBM01148 = 2099,
 IBM01149 = 2100,
 Big5HKSCS = 2101,
 IBM1047 = 2102,
 PTCP154 = 2103,
 Amiga1251 = 2104,
 KOI7switched = 2105,
 BRF = 2106,
 TSCII = 2107,
 CP51932 = 2108,
 windows874 = 2109,
 windows1250 = 2250,
 windows1251 = 2251,
 windows1252 = 2252,
 windows1253 = 2253,
 windows1254 = 2254,
 windows1255 = 2255,
 windows1256 = 2256,
 windows1257 = 2257,
 windows1258 = 2258,
 TIS620 = 2259,
 CP50220 = 2260};}

[*Note [1](#id-note-1)*:

The text_encoding​::​id enumeration
contains an enumerator for each known registered character encoding[.](#id-sentence-1)

For each encoding, the corresponding enumerator is derived from
the alias beginning with âcsâ, as follows

- csUnicode is mapped to text_encoding​::​id​::​UCS2,
- csIBBM904 is mapped to text_encoding​::​id​::​IBM904, and
- the âcsâ prefix is removed from other names[.](#id-sentence-2)

â *end note*]

#### [28.4.2.7](#hash) Hash support [[text.encoding.hash]](text.encoding.hash)

[ð](#lib:hash,text_encoding)

`template<> struct hash<text_encoding>;
`

[1](#hash-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5713)

The specialization is enabled ([[unord.hash]](unord.hash "22.10.19 Class template hash"))[.](#hash-1.sentence-1)
