UTF-32

Revision as of 04:11, 5 May 2025 by imported>Netjeff (Reverted good faith edits by 178.51.59.101 (talk): HTML escapes are codepoints, not UTF-32 encoding.)
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

Template:Short description UTF-32 (32-bit Unicode Transformation Format), sometimes called UCS-4, is a fixed-length encoding used to encode Unicode code points that uses exactly 32 bits (four bytes) per code point (but a number of leading bits must be zero as there are far fewer than 232 Unicode code points, needing actually only 21 bits).<ref name="4_or_3_bytes" /> In contrast, all other Unicode transformation formats are variable-length encodings. Each 32-bit value in UTF-32 represents one Unicode code point and is exactly equal to that code point's numerical value.

The main advantage of UTF-32 is that the Unicode code points are directly indexed. Finding the Nth code point in a sequence of code points is a constant-time operation. In contrast, a variable-length code requires linear-time to count N code points from the start of the string. This makes UTF-32 a simple replacement in code that uses integers that are incremented by one to examine each location in a string, as was commonly done for ASCII. However, Unicode code points are rarely processed in complete isolation, such as combining character sequences and for emoji.<ref name=":0">{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

The main disadvantage of UTF-32 is that it is space-inefficient, using four bytes per code point, including 11 bits that are always zero. Characters beyond the BMP are relatively rare in most texts (except, for example, in the case of texts with some popular emojis), and can typically be ignored for sizing estimates. This makes UTF-32 close to twice the size of UTF-16. It can be up to four times the size of UTF-8 depending on how many of the characters are in the ASCII subset.<ref name=":0" />

HistoryEdit

The original ISO/IEC 10646 standard defines a 32-bit encoding form called UCS-4, in which each code point in the Universal Character Set (UCS) is represented by a 31-bit value from 0 to 0x7FFFFFFF (the sign bit was unused and zero). In November 2003, Unicode was restricted by RFC 3629 to match the constraints of the UTF-16 encoding: explicitly prohibiting code points greater than U+10FFFF (and also the high and low surrogates U+D800 through U+DFFF). This limited subset defines UTF-32.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref><ref name="4_or_3_bytes">{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> Although the ISO standard had (as of 1998 in Unicode 2.1) "reserved for private use" 0xE00000 to 0xFFFFFF, and 0x60000000 to 0x7FFFFFFF<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> these areas were removed in later versions. Because the Principles and Procedures document of ISO/IEC JTC 1/SC 2 Working Group 2 states that all future assignments of code points will be constrained to the Unicode range, UTF-32 will be able to represent all UCS code points and UTF-32 and UCS-4 are identical.<ref>Template:Cite book</ref>

Utility of fixed widthEdit

A fixed number of bytes per code point has theoretical advantages, but each of these has problems in reality:

  • Truncation becomes easier, but not significantly so compared to UTF-8 and UTF-16 (both of which can search backwards for the point to truncate by looking at 2–4 code units at most).Template:EfnTemplate:Citation needed
  • Finding the Nth character in a string. For fixed width, this is simply a O(1) problem, while it is O(n) problem in a variable-width encoding. Novice programmers often vastly overestimate how useful this is.<ref name=manishearth>{{#invoke:citation/CS1|citation

|CitationClass=web }}</ref> Also what a user might call a "character" is still variable-width, for instance the combining character sequence Template:Char could be 2 code points, the emoji Template:Char is three,<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> and the ligature Template:Char is one.

  • Quickly knowing the "width" of a string. However even "fixed width" fonts have varying width, often CJK ideographs are twice as wide,<ref name=manishearth/> plus the already-mentioned problems with the number of code points not being equal to the number of characters.

UseEdit

The main use of UTF-32 is in internal APIs where the data is single code points or glyphs, rather than strings of characters. For instance, in modern text rendering, it is commonTemplate:Citation needed that the last step is to build a list of structures each containing coordinates (x, y), attributes, and a single UTF-32 code point identifying the glyph to draw. Often non-Unicode information is stored in the "unused" 11 bits of each word.Template:Citation needed

Use of UTF-32 strings on Windows (where Template:Mono is 16 bits) is almost non-existent. On Unix systems, UTF-32 strings are sometimes, but rarely, used internally by applications, due to the type Template:Mono being defined as 32-bit.

UTF-32 is also forbidden as an HTML character encoding.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref><ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

Programming languagesEdit

Python versions up to 3.2 can be compiled to use themTemplate:Clarify instead of UTF-16; from version 3.3 onward, Unicode strings are stored in UTF-32 if there is at least 1 non-BMP character in the string, but with leading zero bytes optimized away "depending on the [code point] with the largest Unicode ordinal (1, 2, or 4 bytes)" to make all code points that size.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

Seed7<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> and LassoTemplate:Citation needed programming languages encode all strings with UTF-32, in the belief that direct indexing is important, whereas the Julia programming language moved away from built-in UTF-32 support with its 1.0 release, simplifying the language to having only UTF-8 strings (with all the other encodings considered legacy and moved out of the standard library to package<ref>Template:Citation</ref>) following the "UTF-8 Everywhere Manifesto".<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

C++11 has 2 built-in data types that use UTF-32. The char32_t data type stores 1 character in UTF-32. The u32string data type stores a string of UTF-32-encoded characters. A UTF-32-encoded character or string literal is marked with U before the character or string literal.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref><ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

<syntaxhighlight lang="c++">

  1. include <string>

char32_t UTF32_character = U'🔟'; // also written as U'\U0001F51F' std::u32string UTF32_string = U"UTF–32-encoded string"; // defined as `const char32_t*´ </syntaxhighlight>C# has a UTF32Encoding class which represents Unicode characters as bytes, rather than as a string.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

VariantsEdit

Though technically invalid, the surrogate halves are often encoded and allowed. This allows invalid UTF-16 (such as Windows filenames) to be translated to UTF-32, similar to how the WTF-8 variant of UTF-8 works. Sometimes paired surrogates are encoded instead of non-BMP characters, similar to CESU-8. Due to the large number of unused 32-bit values, it is also possible to preserve invalid UTF-8 by using non-Unicode values to encode UTF-8 errors, though there is no standard for this.

UTF-32 has 2 versions for big-endian and little-endian: UTF-32-BE and UTF-32-LE.

See alsoEdit

NotesEdit

Template:Notelist

ReferencesEdit

Template:Reflist

External linksEdit

Template:Unicode navigation Template:Character encoding