Content deleted Content added
m Reverted 1 edit by 2600:100B:B003:89B8:EF49:FE16:5E57:49FA (talk) to last revision by Remsense |
m 1. “meaning meaning” —> “meaning” 2. “. . . encodings also have been . . .” —> “encodings have also been” Tags: Visual edit Mobile edit Mobile web edit |
||
(53 intermediate revisions by 22 users not shown) | |||
Line 1:
{{Short description|Using numbers to represent text characters}}
{{Use dmy dates|date=January 2018}}
[[File:Papertape-Wikipedia-example-dark1-2000px.png|thumb|[[Punched tape]] with the word "Wikipedia" encoded in [[ASCII]]. Presence and absence of a hole represents 1 and 0, respectively; for example,
'''Character encoding''' is
Early character
The [[Popularity of text encodings|most
== History ==
The history of character codes illustrates the evolving need for machine-mediated character-based symbolic information over a distance, using once-novel electrical means. The earliest codes were based upon manual and hand-written encoding and cyphering systems, such as [[Bacon's cipher]], [[Braille]], [[international maritime signal flags]], and the 4-digit encoding of Chinese characters for a [[Chinese telegraph code]] ([[Hans Schjellerup]], 1869). With the adoption of electrical and electro-mechanical techniques these earliest codes were adapted to the new capabilities and limitations of the early machines. The earliest well-known electrically transmitted character code, [[Morse code]], introduced in the 1840s, used a system of four "symbols" (short signal, long signal, short space, long space) to generate codes of variable length. Though some commercial use of Morse code was via machinery, it was often used as a manual code, generated by hand on a [[telegraph key]] and decipherable by ear, and persists in [[amateur radio]] and [[Non-directional beacon|aeronautical]] use. Most codes are of fixed per-character length or variable-length sequences of fixed-length codes (e.g. [[Unicode]]).<ref>{{cite web | url=http://blog.smartbear.com/development/ancient-computer-character-code-tables-and-why-theyre-still-relevant/ | title=Ancient Computer Character Code Tables – and Why They're Still Relevant | publisher=Smartbear | date=17 April 2014 | access-date=29 April 2014 | author=Tom Henderson |url-status=dead |archive-url=https://web.archive.org/web/20140430000312/http://blog.smartbear.com/development/ancient-computer-character-code-tables-and-why-theyre-still-relevant/ |archive-date= Apr 30, 2014 }}</ref>
Common examples of character encoding systems include Morse code, the [[Baudot code]], the [[American Standard Code for Information Interchange]] (ASCII) and Unicode. Unicode, a well-defined and extensible encoding system, has
The Baudot code, a five-[[bit]] encoding, was created by [[Émile Baudot]] in 1870, patented in 1874, modified by Donald Murray in 1901, and standardized by CCITT as International Telegraph Alphabet No. 2 (ITA2) in 1930. The name ''baudot'' has been erroneously applied to ITA2 and its many variants. ITA2 suffered from many shortcomings and was often improved by many equipment manufacturers, sometimes creating compatibility issues.
[[File:Blue-punch-card-front-horiz.png|thumb|Hollerith 80-column punch card with EBCDIC character set]]
[[Herman Hollerith]] invented punch card data encoding in the late 19th century to analyze census data. Initially, each hole position represented a different data element, but later, numeric information was encoded by numbering the lower rows 0 to 9, with a punch in a column representing its row number. Later alphabetic data was encoded by allowing more than one punch per column. Electromechanical [[tabulating machine]]s represented date internally by the timing of pulses relative to the motion of the cards through the machine
When [[IBM]]
In 1959 the U.S. military defined its [[Fieldata]] code, a six-or seven-bit code, introduced by the U.S. Army Signal Corps. While Fieldata addressed many of the then-modern issues (e.g. letter and digit codes arranged for machine collation), it fell short of its goals and was short-lived. In 1963 the first ASCII code was released (X3.4-1963) by the ASCII committee (which contained at least one member of the Fieldata committee, W. F. Leubbert), which addressed most of the shortcomings of Fieldata, using a simpler seven-bit code. Many of the changes were subtle, such as collatable character sets within certain numeric ranges. ASCII63 was a success, widely adopted by industry, and with the follow-up issue of the 1967 ASCII code (which added lower-case letters and fixed some "control code" issues) ASCII67 was adopted fairly widely. ASCII67's American-centric nature was somewhat addressed in the European [[ECMA-6]] standard.<ref>{{cite web | url=https://www.sr-ix.com/Archive/CharCodeHist/index.html | title=An annotated history of some character codes | date= 20 April 2016 |website=Sensitive Research | access-date=1 November 2018 | author=Tom Jennings}}</ref> Eight-bit [[extended ASCII]] encodings, such as various vendor extensions and the [[ISO/IEC 8859]] series, supported all ASCII characters as well as additional non-ASCII characters.
In trying to develop universally interchangeable character encodings, researchers in the 1980s faced the dilemma that, on the one hand, it seemed necessary to add more bits to accommodate additional characters, but on the other hand, for the users of the relatively small character set of the Latin alphabet (who still constituted the majority of computer users), those additional bits were a colossal waste of then-scarce and expensive computing resources (as they would always be zeroed out for such users). In 1985, the average personal computer user's [[hard disk drive]] could store only about 10 megabytes, and it cost approximately US$250 on the wholesale market (and much higher if purchased separately at retail),<ref name="Strelho">{{cite news |last1=Strelho |first1=Kevin |title=IBM Drives Hard Disks to New Standards |url=https://books.google.com/books?id=zC4EAAAAMBAJ&pg=PA29 |access-date=November 10, 2020 |work=InfoWorld |publisher=Popular Computing Inc. |date=April 15, 1985 |pages=29–33}}</ref> so it was very important at the time to make every bit count.▼
▲
The compromise solution that was eventually found and {{vague|text=developed into Unicode|reason=Became Unicode or was added to Unicode? See talk page.|date=April 2023}} was to break the assumption (dating back to telegraph codes) that each character should always directly correspond to a particular sequence of bits. Instead, characters would first be mapped to a universal intermediate representation in the form of abstract numbers called [[code point]]s. Code points would then be represented in a variety of ways and with various default numbers of bits per character (code units) depending on context. To encode code points higher than the length of the code unit, such as above 256 for eight-bit units, the solution was to implement [[variable-width encoding|variable-length encodings]] where an escape sequence would signal that subsequent bits should be parsed as a higher code point.
== Terminology ==
===Character===
* {{anchor|repertoire}}A ''character repertoire'' is the set of characters that can be represented by a particular coded character set.<ref name="Unicode glossary"/><ref name="unicode15">{{cite book |title=The Unicode Standard Version 15.0 – Core Specification |date=September 2022 |publisher=Unicode Consortium |isbn=978-1-936213-32-0 |chapter=Chapter 3: Conformance |url=https://www.unicode.org/versions/Unicode15.0.0/ch03.pdf}}</ref> The repertoire may be closed, meaning that no additions are allowed without creating a new standard (as is the case with ASCII and most of the ISO-8859 series); or it may be open, allowing additions (as is the case with Unicode and to a limited extent [[Windows code page]]s).<ref name="unicode15"/>▼
* A ''code point'' is a value or position of a character in a coded character set.<ref name="Unicode glossary"/>▼
* A ''code unit'' is the minimum bit combination that can represent a character in a character encoding (in [[computer science]] terms, it is the [[Word (computer architecture)|word]] size of the character encoding).<ref name="Unicode glossary"/><ref name="utr17"/> For example, common code units include 7-bit, 8-bit, 16-bit, and 32-bit. In some encodings, some characters are encoded using multiple code units; such an encoding is referred to as a [[variable-width encoding]].▼
What constitutes a character varies between character encodings. For example, for letters with [[diacritic]]s, there are two distinct approaches that can be taken to encode them
===Code pages===▼
{{main|Code page}}▼
===Character set===
Originally, a code page referred to a specific [[page number]] in the IBM standard character set manual, which would define a particular character encoding.<ref name="DEC_VT510">{{cite web |title=VT510 Video Terminal Programmer Information |at=7.1. Character Sets - Overview |publisher=[[Digital Equipment Corporation]] (DEC) |url=http://www.vt100.net/docs/vt510-rm/chapter7.html#S7.1 |access-date=2017-02-15 |quote=In addition to traditional [[Digital Equipment Corporation|DEC]] and [[ISO]] character sets, which conform to the structure and rules of [[ISO 2022]], the [[VT510]] supports a number of IBM PC code pages ([[page number]]s in IBM's standard character set manual) in [[PCTerm]] mode to emulate the [[console terminal]] of industry-standard PCs. |archive-date=2016-01-26 |archive-url=https://web.archive.org/web/20160126192029/http://www.vt100.net/docs/vt510-rm/chapter7.html#S7.1 |url-status=live }}</ref> Other vendors, including [[Microsoft]], [[SAP AG|SAP]], and [[Oracle Corporation]], also published their own sets of code pages; the most well-known code page suites are "[[Windows code page|Windows]]" (based on Windows-1252) and "IBM"/"DOS" (based on [[code page 437]]).▼
A character set is a collection of characters used to represent text.<ref name="SteeleMSDN"/><ref name="Unicode glossary"/> For example, the [[Latin alphabet]] and [[Greek alphabet]] are character sets.
==={{anchor|CCS}}Coded character set===
A coded character set is a character set with each item uniquely mapped to a numberic value.<ref name="Unicode glossary"/>
▲
The term "code page" is not used in Unix or Linux, where "charmap" is preferred, usually in the larger context of locales. IBM's Character Data Representation Architecture (CDRA) designates entities with coded character set identifiers ([[CCSID]]s), each of which is variously called a "charset", "character set", "code page", or "CHARMAP".<ref name=utr17/>▼
In [[Unix]] and [[Unix-like]] systems, the term ''charmap'' is commonly used; usually in the larger context of locales.
===Code units===▼
* A code unit in [[UTF-8]], [[EBCDIC]] and [[GB 18030]] consists of 8 bits;▼
* A code unit in [[UTF-16]] consists of 16 bits;▼
* A code unit in [[UTF-32]] consists of 32 bits.▼
▲
A code point is represented by a sequence of code units. The mapping is defined by the encoding. Thus, the number of code units required to represent a code point depends on the encoding:▼
==={{anchor|repertoire}}Character repertoire===
▲
▲A [[code point]] is the value or position of a character in a coded character set.<ref name="Unicode glossary"/> A code point is represented by a sequence of code units. The mapping is defined by the encoding. Thus, the number of code units required to represent a code point depends on the encoding:
* UTF-8: code points map to a sequence of one, two, three or four code units.
* UTF-16: code units are twice as long as 8-bit code units. Therefore, any code point with a scalar value less than U+10000 is encoded with a single code unit. Code points with a value U+10000 or higher require two code units each. These pairs of code units have a unique term in UTF-16: [[UTF-16#Code points from U+010000 to U+10FFFF|"Unicode surrogate pairs".]]
Line 60 ⟶ 58:
* GB 18030: multiple code units per code point are common, because of the small code units. Code points are mapped to one, two, or four code units.<ref>{{cite web | url=https://docs.oracle.com/javase/tutorial/i18n/text/terminology.html | title=Terminology (The Java Tutorials) | publisher=Oracle | access-date=25 March 2018 }}</ref>
===
▲
▲For example, for letters with [[diacritic]]s, there are two distinct approaches that can be taken to encode them: they can be encoded either as a single unified character (known as a precomposed character), or as separate characters that combine into a single [[glyph]]. The former simplifies the text handling system, but the latter allows any letter/diacritic combination to be used in text. [[Typographic ligature|Ligatures]] pose similar problems.
▲
For example:
* [[ASCII]]: 7 bits
==Unicode encoding
[[Unicode]] and its parallel standard, the ISO/IEC 10646 [[Universal Character Set]], together constitute a unified standard for character encoding. Rather than mapping characters directly to [[byte]]s, Unicode separately defines a coded character set that maps characters to unique natural numbers ([[code point]]s), how those code points are mapped to a series of fixed-size natural numbers (code units), and finally how those units are encoded as a stream of octets (bytes). The purpose of this decomposition is to establish a universal set of characters that can be encoded in a variety of ways. To describe
===Abstract character repertoire===
An
===Coded character set===
A
===Character encoding form===
A
===Character encoding scheme===
A
Although [[UTF-32BE]] and [[UTF-32LE]] are simpler CESes, most systems working with Unicode use either [[UTF-8]], which is [[backward compatibility|backward compatible]] with fixed-length ASCII and maps Unicode code points to variable-length sequences of octets, or [[UTF-16BE]],{{cn|date=August 2023}} which is [[backward compatibility|backward compatible]] with fixed-length UCS-2BE and maps Unicode code points to variable-length sequences of 16-bit words. See [[comparison of Unicode encodings]] for a detailed discussion.
===Higher-level protocol===
The Unicode model uses the term "character map" for other systems which directly assign a sequence of characters to a sequence of bytes, covering all of the CCS, CEF and CES layers.<ref name="utr17" />
===
The following table
{| class="wikitable MsoNormalTable"
! Character
!
! Glyph
|-
Line 120 ⟶ 127:
===Example===
Consider
* Four [[Character (computing)|composed characters]]:
*:{{code|a}}, {{code|b̲}}, {{code|c}}, {{code|𐐀}}
Line 137 ⟶ 144:
== Transcoding ==
* [[Web browser]]
▲* [[Web browser]]s – most modern web browsers feature automatic [[character encoding detection]]. On Firefox 3, for example, see the View/Character Encoding submenu.
* [[luit]] –
▲* [[iconv]] – a program and standardized API to convert encodings
* [[International Components for Unicode]] – A set of C and Java libraries
▲* [[luit]] – a program that converts encoding of input and output to programs running interactively
* Encoding.Convert – [[.NET]] API<ref>{{cite web|url=https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.convert?redirectedfrom=MSDN&view=net-6.0#overloads|work=Microsoft .NET Framework Class Library|title=Encoding.Convert Method}}</ref>▼
▲* [[International Components for Unicode]] – A set of C and Java libraries to perform charset conversion. uconv can be used from ICU4C.
* MultiByteToWideChar/WideCharToMultiByte –
▲* Encoding.Convert – .NET API<ref>{{cite web|url=https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.convert?redirectedfrom=MSDN&view=net-6.0#overloads|work=Microsoft .NET Framework Class Library|title=Encoding.Convert Method}}</ref>
▲* MultiByteToWideChar/WideCharToMultiByte – to convert from ANSI to Unicode & Unicode to ANSI<ref>{{cite web|url=https://learn.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar|title=MultiByteToWideChar function (stringapiset.h)|website=Microsoft Docs|date=13 October 2021 }}</ref><ref>{{cite web|url=https://learn.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-widechartomultibyte|title=WideCharToMultiByte function (stringapiset.h)|website=Microsoft Docs|date=9 August 2022 }}</ref>
== Common character encodings ==
{{Main|Popularity of text encodings}}
{{Expand section|Popularity and comparison:
* Statistics on popularity
* Especially, a comparison of the advantages and disadvantages of the few 3-5 most common character encodings (e.g. UTF-8, UTF-16 and UTF-32)|date=June 2024}}
The [[Popularity of text encodings|most used character encoding]] on the [[World Wide Web|web]] is [[UTF-8]], used in 98.2% of surveyed web sites, as of May 2024.<ref name="W3TechsWebEncoding" /> In [[Application software|application programs]] and [[operating system]] tasks, both UTF-8 and [[UTF-16]] are popular options.<ref name=":0" /><ref name=":1">{{Cite web |last=Galloway |first=Matt |date=9 October 2012 |title=Character encoding for iOS developers. Or UTF-8 what now? |url=https://www.galloway.me.uk/2012/10/character-encoding-for-ios-developers-utf8/ |access-date=2021-01-02 |website=Matt Galloway |language=en |quote=in reality, you usually just assume UTF-8 since that is by far the most common encoding. }}</ref>
{{Div col|colwidth=30em}}
* [[ISO/IEC 646|ISO 646]]
Line 175 ⟶ 180:
** [[ISO/IEC 8859-15|ISO 8859-15]] Added the Euro sign and other rationalisations to ISO 8859-1
** [[ISO/IEC 8859-16|ISO 8859-16]] Central, Eastern and Southern European languages (Albanian, Bosnian, Croatian, Hungarian, Polish, Romanian, Serbian and Slovenian, but also French, German, Italian and Irish Gaelic)
* [[Code page 437|CP437]],
* [[Windows code page|MS-Windows character sets]]:
** [[Windows-1250]] for Central European languages that use Latin script, (Polish, Czech, Slovak, Hungarian, Slovene, Serbian, Croatian, Bosnian, Romanian and Albanian)
Line 218 ⟶ 223:
== See also ==
*
*
*
* {{Annotated link|Charset sniffing}}
* [[:Category:Character encoding]] – articles related to character encoding in general
* [[:Category:Character sets]] – articles detailing specific character encodings
*
* {{Annotated link|Mojibake}}
* {{Annotated link|Mojikyō}}
*
* {{Annotated link|TRON (encoding)}}
*
== References ==
Line 250 ⟶ 255:
{{DEFAULTSORT:Character Encoding}}
[[Category:Character encoding| ]]
[[Category:Digital typography]]
[[Category:Natural language and computing|Encoding]]
|