
In coding theory, variable-length encoding is a type of character encoding scheme in which codes of differing lengths are used to encode a character set (a repertoire of symbols) for representation in a computer.[1] The equivalent concept in computer science is bit string.
Variable-length codes can allow sources to be compressed and decompressed with zero error (lossless data compression) and still be read back symbol by symbol. An independent and identically-distributed source may be compressed almost arbitrarily close to its entropy. This is in contrast to fixed-length coding methods, for which data compression is only possible for large blocks of data, and any compression beyond the logarithm of the total number of possibilities comes with a finite (though perhaps arbitrarily small) probability of failure.
For these reasons, they were sometimes used to pack English text into fewer bytes in adventure games for early microcomputers. However, disks, increases in computer memory, and general purpose compression algorithms have rendered such methods obsolete.
Multibyte encodings are usually the result of a need to increase the number of characters which can be encoded without breaking backward compatibility with an existing constraint. For example, with one byte (8 bits) per character, one can encode 256 possible characters; in order to encode more than 256 characters, the obvious choice would be to use two or more bytes per encoding unit, two bytes (16 bits) would allow 65,536 possible characters, but such a change would break compatibility with existing systems and therefore might not be feasible at all.
Unlikely source symbols can be assigned longer codewords while likely source symbols can be assigned shorter codewords, thus giving a low expected codeword length. Some examples of well-known variable-length coding strategies are Huffman coding, Lempel–Ziv coding, arithmetic coding, and context-adaptive variable-length coding.
A multibyte encoding system minimises disruption to existing software by keeping some characters as single-unit codes, while others require multiple units. This creates three unit types: singletons (which consist of a single unit), lead units (which come first in a multiunit sequence), and trail units (which come afterwards in a multiunit sequence). Input and display systems must handle these structures, though most other software does not.
For example, the four character string "" is encoded in UTF-8 like this (shown as hexadecimal byte values): . Of the six units in that sequence,,, and are singletons (for,, and), is a lead unit and and are trail units. The heart symbol is represented by the combination of the lead unit and the two trail units.
UTF-8 clearly distinguishes singletons, leads, and trails with non-overlapping value ranges. By contrast, older encodings often reuse values, making it harder to parse text correctly. This can cause false positives in searches or make a corrupted byte disrupt long sequences. In well-designed encodings like UTF-8, searching works reliably, and corruption affects only the character containing the bad unit.
The extension of a code is the mapping of finite length source sequences to finite length bit strings, that is obtained by concatenating for each symbol of the source sequence the corresponding codeword produced by the original code. Using terms from formal language theory, the precise mathematical definition is as follows: Let
S
T
C:S\toT*
S
T
C
S*
T*
Variable-length codes can be strictly nested in order of decreasing generality as non-singular codes, uniquely decodable codes, and prefix codes. Prefix codes are always uniquely decodable, and these in turn are always non-singular:
A code is non-singular if each source symbol is mapped to a different non-empty bit string; that is, the mapping from source symbols to bit strings is injective.
For example, the mapping
M1=\{tt{a}\mapstott{0},tt{b}\mapstott{0},tt{c}\mapstott{1}\}
However, the mapping
M2=\{tt{a}\mapstott{1},tt{b}\mapstott{011},tt{c}\mapstott{01110},tt{d}\mapstott{1110},tt{e}\mapstott{10011},tt{f}\mapstott{0}\}
A code is uniquely decodable if its extension is § non-singular. Whether a given code is uniquely decodable can be decided with the Sardinas–Patterson algorithm.
The mapping
M3=\{tt{a}\mapstott{0},tt{b}\mapstott{01},tt{c}\mapstott{011}\}
Consider again the code
M2
See main article: Prefix code.
A code is a prefix code if no target bit string in the mapping is a prefix of the target bit string of a different source symbol in the same mapping. This means that symbols can be decoded instantaneously after their entire codeword is received. Other commonly used names for this concept are prefix-free code, instantaneous code, or context-free code. A special case of prefix codes are block codes, LEB128, and variable-length quantity (VLQ) codes.
For example, the mapping
M3
Example of encoding and decoding:
→ → →
For this example, if the probabilities of
(tt{a},tt{b},tt{c},tt{d})
|
| 1 | |
| 4 |
,
| 1 | |
| 8 |
,
| 1 | |
| 8 |
\right)
| 1 x | 1 | +2 x |
| 2 |
| 1 | +3 x | |
| 4 |
| 1 | +3 x | |
| 8 |
| 1 | = | |
| 8 |
| 7 | |
| 4 |