Character encoding
{{Selfref|"Special characters" redirects here. For the use of special characters on Wikipedia, see
Wikipedia:Special characters.}}A
character encoding consists of a
code that pairs a sequence of
characters from a given
character set (sometimes incorrectly referred to as
code page) with something else, such as a sequence of natural
numbers,
octets or electrical pulses, in order to facilitate the
storage of
text in
computers and the transmission of text through telecommunication networks. Common examples include
Morse code, which encodes letters of the
Latin alphabet as series of long and short depressions of a
telegraph key; and
ASCII, which encodes letters, numerals, and other symbols, as
integers.In earlier days of computing, the introduction of
coded character sets such as
ASCII (1963) and
EBCDIC (1964) began the process of standardization. The limitations of such sets soon became apparent, and a number of
ad-hoc methods developed to extend them. The need to support more
writing systems for different languages, including the
CJK family of East Asian scripts, required support for a far larger number of characters and demanded a systematic approach to character encoding rather than the previous ad hoc approaches.
Simple character sets
Conventionally character set and character encoding were considered synonymous, as the same standard would specify both what characters were available and how they were to be encoded into a stream of code units (usually with a single character per code unit). For historical reasons,
MIME and systems based on it use the term
charset to refer to the complete system for encoding a sequence of characters into a sequence of octets.
Modern encoding model
Unicode and its parallel standard, ISO 10646
Universal Character Set, which together constitute the most modern character encoding, broke away from this idea, and instead separated the ideas of what characters are available, their numbering, how those numbers are encoded as a series of "code units" (limited-size numbers), and finally how those units are encoded as a stream of octets (bytes). The idea behind this decomposition is to establish a universal set of characters that can be encoded in a variety of ways
(1). To correctly describe this model needs more precise terms than "character set" and "character encoding". The terms used in the modern model follow:A
character repertoire is the full set of abstract characters that a system supports. The repertoire may be closed, that is 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 the
Windows code pages). The characters in a given repertoire reflect decisions that have been made about how to divide writing systems into linear information units. The basic variants of the
Latin,
Greek, and
Cyrillic alphabets, can be broken down into letters, digits, punctuation, and a few
special characters like the space, which can all be arranged in simple linear sequences that are displayed in the same order they are read. Even with these alphabets however
diacritics pose a complication: they can be regarded either as part of a single character containing a letter and diacritic (known in modern terminology as a precomposed character), or as separate characters. The former allows a far simpler text handling system but the latter allows any letter/diacritic combination to be used in text. Other writing systems, such as Arabic and Hebrew, are represented with more complex character repertoires due to the need to accommodate things like bidirectional text and
glyphs that are joined together in different ways for different situations.A
coded character set specifies how to represent a repertoire of characters using a number of non-negative integer codes called
code points. For example, in a given repertoire, a character representing the capital letter "A" in the Latin alphabet might be assigned to the integer 65, the character for "B" to 66, and so on. A complete set of characters and corresponding integers is a coded character set. Multiple coded character sets may share the same repertoire; for example
ISO-8859-1 and IBM code pages
037 and
500 all cover the same repertoire but map them to different codes. In a coded character set, each code point only represents one character.A
character encoding form (CEF) specifies the conversion of a coded character set's integer codes into a set of limited-size integer
code values that facilitate storage in a system that represents numbers in binary form using a fixed number of bits (i.e. practically any computer system). For example, a system that stores numeric information in 16-bit units would only be able to directly represent integers from 0 to 65,535 in each unit, but larger integers could be represented if more than one 16-bit unit could be used. This is what a CEF accommodates: it defines a way of mapping
single code
point from a range of, say, 0 to 1.4 million, to a series of
one or more code
values from a range of, say, 0 to 65,535.The simplest CEF system is simply to choose large enough units that the values from the coded character set can be encoded directly (one code point to one code value). This works well for coded character sets that fit in 8 bits (as most legacy non-CJK encodings do) and reasonably well for coded character sets that fit in 16 bits (such as early versions of Unicode). However, as the size of the coded character set increases (e.g. modern Unicode requires at least 21 bits/character), this becomes less and less efficient, and it is difficult to adapt existing systems to use larger code values. Therefore, most systems working with later versions of Unicode use either
UTF-8, which maps Unicode code points to variable-length sequences of octets, or
UTF-16, which maps Unicode code points to variable-length sequences of 16-bit words.Next, a
character encoding scheme (CES) specifies how the fixed-size integer codes should be mapped into an octet sequence suitable for saving on an octet-based file system or transmitting over an octet-based network. With Unicode, a simple character encoding scheme is used in most cases, simply specifying whether the bytes for each integer should be in big-
endian or little-endian order (even this isn't needed with UTF-8). However, there are also compound character encoding schemes, which use escape sequences to switch between several simple schemes (such as
ISO 2022), and compressing schemes, which try to minimise the number of bytes used per code unit (such as
SCSU,
BOCU, and
Punycode).Finally, there may be a
higher level protocol which supplies additional information that can be used to select the particular variant of a
Unicode character, particularly where there are regional variants that have been 'unified' in Unicode as the same character. An example is the XML attribute xml:lang.
History of character encodings
Early binary repertoires:
Popular character encodings
- ISO 646
- EBCDIC
- ISO 8859:
- ISO 8859-1 Western Europe
- ISO 8859-2 Western and Central Europe
- ISO 8859-3 Western Europe and South European ( Turkish, Maltese plus Esperanto )
- ISO 8859-4 Western Europe and Baltic countries ( Lithuania, Estonia and Lapp )
- ISO 8859-5 Cyrillic alphabet
- ISO 8859-6 Arabic
- ISO 8859-7 Greek
- ISO 8859-8 Hebrew
- ISO 8859-9 Western Europe with amended Turkish character set
- ISO 8859-10 Western Europe with rationalised character set for Nordic languages, including complete Icelandic set.
- ISO 8859-11 Thai
- ISO 8859-13 Baltic languages plus Polish
- ISO 8859-14 Celtic languages ( Irish Gaelic, Scottish, Welsh )
- ISO 8859-15 Added the Euro sign and other rationalisations to ISO 8859-1
- ISO 8859-16 Central European languages ( Polish, Czech, Slovenian, Slovak, Hungarian, Albanian, Romanian, German, Italian )
- CP437, CP737, CP850, CP852, CP855, CP857, CP858, CP860, CP861, CP863, CP865, CP866, CP869
- MS-Windows character sets:
- Mac OS Roman
- KOI8-R, KOI8-U, KOI7
- MIK
- Cork or T1
- ISCII
- TSCII
- VISCII
- JIS X 0208 is a widely deployed standard for Japanese character encoding that has several encoding forms.
- JIS X 0213 is an extended version of JIS X 0208.
- Chinese Guobiao
- Taiwan Big5 (a more famous variant is Microsoft Code page 950)
- Hong Kong HKSCS
- KS X 1001 is a Korean double-byte character encoding standard
- Unicode (and subsets thereof, such as the 16-bit 'Basic Multilingual Plane'). See UTF-8
- ANSEL or ISO/IEC 6937
Character conversion tools
{{unencyclopedic}}
Cross-platform:
- iconv – program and standardized API to convert encodings
- convert_encoding.py – Python based utility to convert text files between arbitrary encodings and line endings.(2)
- decodeh.py - algorithm and module to heuristically guess the encoding of a string (3)
Linux:
- recode – convert file contents from one encoding to another (4)
- utrac – convert file contents from one encoding to another.(5)
- cstocs – convert file contents from one encoding to another
- convmv – convert a filename from one encoding to another.(6)
- enca – analyzes encodings for given text files/(7)
Windows:
- cscvt – character set conversion tool(8)
See also
- (:Category:Character encoding) — articles related to character encoding in general
- (:Category:Character sets) — articles detailing specific character encodings
- Code page — various character set encodings used by Microsoft
- Windows code page — various character set encodings used by Microsoft Windows
- Mojibake — character set mismap.
References
-
[Unicode Technical Report N°17 - Character Encoding Model]
-
[Homepage of Michael Goerz - convert_encoding.py]
-
[decodeh - heuristically decode a string or text file]
-
[recode - GNU Project - Free Software Foundation (FSF)]
-
[Utrac Homepage]
-
[convmv - converts filenames from one encoding to another]
-
[Extremely Naive Charset Analyser ]
-
[Character Set Converter]
External links
{{character encoding}}(zh-min-nan:Pian-bé)
Znaková sadaTegnsætZeichenkodierungCodificación de caracteresCodage de caractèresCodificación de caracteres문자 인코딩Penyandian karakterCodifica di caratteriקידוד תווים文字コードKod znakuCodificação de caracteresКодировкаTeckenkodningCharacter encodingКодування символів字符集
(...as imported from WP)
article has not been saved locally