Unicode is a specification that describes text representation. In particular, it specifies a list of many standardized characters. Each character is assigned a number. The appearance of a character is not specified, only it's name, number and some properties (is letter capital or not, etc).
For example: “042A - Cyrillic Capital Letter Hard Sign”
The number of assigned numbers is huge, that's why unicode requires at least 21 bit of storage per the single character.
Unicode also specifies several representations of text. The simplest representation - the sequence of numbers (most often 32-bit ones) - is highly space-comsuming. For english text it is 4 times worse than ASCII. That's why there are 3 standard forms of text representation: UTF-32, UTF-16 and UTF-8.
UTF-32 is just a plain sequence of character numbers. It requires 32 bits per storage unit, hence the name.
UTF-16 and UTF-8 can be though of as a kind of data compression, like gzip or bzip2. UTF-16 uses 16-bit storage units and UTF-8 uses 8-bit storage units. The size of the storage unit only has meaning internal to compression and decompression algorithms. All three forms are equally good for the purpose of preserving the whole text.
UTF-8 and UTF-16 differ from common data compression algorithms like zip flavors. They are specifically designed for text. The main difference between general data compression algos and compressed UTF forms is that data are usually stored in compressed form and are decompressed when used. On the contrary applications usually store text in memory using UTF-8 or UTF-16. It's possible to perform most of text processing directly on UTF-8 and UTF-16 text without having to decode them into any temporary storage.
UTF-8 has some characteristics making it very appropriate for UNIX-like systems:
There are a couple of things that make Unicode harder to work with:
This description of Unicode is neither complete nor strict, for more details read: