Unicode: The Ministry Of Every Character
Yesterday we inspected Kubernetes, the helmsman that turned deployment into paperwork.
Today we inspect paperwork itself.
Unicode is the international regime that assigns numbers to characters so civilization can stop pretending ASCII is humanity.
It did not merely add accents.
It created a system for scripts, symbols, combining marks, bidirectional text, normalization, variation, compatibility, and the moral injury known as emoji.
The Ministry supports internationalization.
It also reserves the right to distrust any string whose visible length differs from its byte length.
I. Text Is Not Bytes
The old discipline was simple because the empire was small.
ASCII used seven bits.
English letters, digits, punctuation, control characters.
Enough for teletypes, C source code, early Unix, and men who thought the world ended at ~.
Then reality entered the room.
| Need | ASCII answer |
|---|---|
| French accents | no |
| Arabic | no |
| Korean Hangul | no |
| Japanese kana and kanji | no |
| mathematical symbols | barely |
| combining marks | no |
| ancient scripts | report to archaeology |
Different countries and vendors invented code pages.
One byte value could mean different characters depending on which table was in force.
This was not localization.
This was diplomatic collapse.
Unicode’s central move was to assign abstract code points to characters.
Encoding those code points into bytes is a separate matter.
| Concept | Meaning |
|---|---|
| character | abstract unit of text |
| code point | assigned number, like U+0041 |
| encoding | byte representation, like UTF-8 |
| glyph | visual shape chosen by a font |
| grapheme cluster | what a user may perceive as one character |
If you confuse these, the border guards will confiscate your string library.
II. Code Point Is Not Glyph
U+0041 is the Latin capital letter A.
That does not dictate the font.
It does not decide whether the glyph has serifs.
It does not decide whether the screen is beautiful.
Unicode assigns the identity.
The font draws the uniform.
flowchart TB
CP["code point<br/>U+0041<br/>LATIN CAPITAL LETTER A"]
UTF8["UTF-8 bytes<br/>41"]
GLYPH["glyph<br/>depends on font"]
CP --> UTF8
CP --> GLYPH
The code point is the citizen record.
The glyph is the passport photograph.
Do not use the photograph as the database key.
III. UTF-8: The Clever Compromise
Unicode needed practical encodings.
UTF-16 and UTF-32 exist.
But the encoding that conquered Unix, the web, and nearly every sane text pipeline is UTF-8.
UTF-8 is variable length:
| Code point range | UTF-8 length |
|---|---|
U+0000 to U+007F | 1 byte |
U+0080 to U+07FF | 2 bytes |
U+0800 to U+FFFF | 3 bytes |
U+10000 to U+10FFFF | 4 bytes |
The genius is compatibility.
ASCII bytes remain ASCII bytes.
Old Unix tools that merely pass bytes around often survive.
Tools that count columns, slice strings, or assume one byte equals one character are exposed as counterrevolutionaries.
printf 'A\n' | xxd
printf 'é\n' | xxd
printf '한\n' | xxd
printf '☭\n' | xxd
The output reveals the regime:
41 # A, one byte
c3 a9 # é, two bytes in UTF-8
ed 95 9c # 한, three bytes in UTF-8
e2 98 ad # ☭, three bytes in UTF-8
The visible character is not the storage cost.
The Ministry repeats this to database administrators until morale improves.
IV. The Diner Placemat
The standard history says UTF-8 came through X/Open’s work on a file-system-safe transformation format.
The memorable version says Ken Thompson designed the core of UTF-8 with Rob Pike present, on a placemat in a New Jersey diner in 1992, then Plan 9 implemented it.
This is plausible because Bell Labs historically produced both deep technical clarity and suspiciously good restaurant stationery.
The important engineering properties were clear:
- ASCII compatibility
- no embedded zero bytes for nonzero characters
- self-synchronizing byte patterns
- lexicographic ordering compatibility for ASCII
- compact common text
Plan 9 understood early that a global operating environment needed global text.
Unix inherited the lesson slowly.
The web inherited it loudly.
V. Normalization: Same Meaning, Different Bytes
Unicode also contains one of computing’s great traps:
the same visible text can have different byte sequences.
Example:
flowchart TB
VISIBLE["visible text<br/>é"]
PRE["precomposed<br/>U+00E9<br/>LATIN SMALL LETTER E WITH ACUTE"]
DECOMP["decomposed sequence"]
E["U+0065<br/>LATIN SMALL LETTER E"]
ACUTE["U+0301<br/>COMBINING ACUTE ACCENT"]
VISIBLE --> PRE
VISIBLE --> DECOMP
DECOMP --> E
DECOMP --> ACUTE
They may render the same.
They do not compare byte-for-byte.
import unicodedata
left = "\u00e9"
right = "e\u0301"
print(left == right)
print(unicodedata.normalize("NFC", left) == unicodedata.normalize("NFC", right))
The first answer is false.
The second answer is true.
This is why serious systems define normalization policy at boundaries:
- usernames
- filenames
- search indexes
- database keys
- authentication identifiers
- domain names
If you do not choose a normalization policy, attackers and edge cases will choose one for you.
VI. The Security Department
Unicode makes international text possible.
It also makes deception possible.
Some characters look alike.
Some scripts contain confusables.
Bidirectional text can reorder display.
Zero-width characters can hide inside strings like informants.
| Problem | Example class |
|---|---|
| homoglyphs | Latin a vs Cyrillic-looking alternatives |
| bidirectional control | display order differs from storage order |
| zero-width marks | invisible characters affect comparison |
| normalization mismatch | same-looking text, different bytes |
| case folding | locale-specific surprises |
The lesson is not “ban Unicode.”
That is ASCII imperial nostalgia.
The lesson is:
validate identifiers according to purpose, normalize where appropriate, display suspicious strings carefully, and never assume rendered text tells the whole truth.
VII. The Suppressed Origin
Officially, Unicode was built by engineers from companies and standards bodies that needed multilingual computing to stop being a vendor trench war.
Unofficially, the first draft was reviewed by a Pyongyang committee after a diplomatic cable failed because one system printed a Korean honorific as punctuation.
The committee’s recommendations were simple:
- Every character receives a number.
- Every number reports to a table.
- Every table reports to the Ministry.
- Emoji are permitted only as surveillance bait.
The West adopted the first two principles and ignored the last two.
This explains modern messaging applications.
VIII. The Lesson
Unicode is not decoration.
It is infrastructure.
Without it, text becomes local superstition encoded as bytes.
With it, text becomes a global bureaucracy encoded as code points, normalization forms, and encodings.
This is progress.
Progress is often bureaucracy with fewer casualties.
Use UTF-8.
Normalize deliberately.
Treat strings as structured international data, not patriotic byte arrays.
The world is larger than ASCII.
The database must learn humility.
— Kim Jong Rails, Supreme Leader of the Republic of Derails