[text.encoding] # 28 Text processing library [[text]](./#text) ## 28.4 Text encodings identification [text.encoding] ### [28.4.1](#syn) Header 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 struct hash; template<> struct hash;} ### [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 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 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 { 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 andranges​::​range_reference_t denote const char*[.](#aliases-2.sentence-1) [3](#aliases-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5417) ranges​::​iterator_t 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; ` [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)