Software

The Letters Apple Never Shipped

Classic Mac OS never had a Vietnamese encoding, not even after it learned Unicode. So the Vietnamese on those disks lives in the fonts, and we had to go and find the fonts.

·12 min read·Software

A short stack of aged printed pages held by a lime-green paperclip, with a black floppy disk resting against them on a workbench under a desk lamp; the printing is too soft to read.

Open a 1990s Vietnamese document from a classic Mac disk in anything modern and you get something like qu·n. Open it on the Mac that wrote it and you get quán. The bytes are identical. What changed is the font.

This post is about why that happens, and about the archaeology it took to read those bytes again. That meant searching an internet that has mostly rotted away, using tools that predate the search engines we would normally reach for.

A script that does not fit in a byte

Vietnamese is written in the Latin alphabet, but it uses a great deal of it. Six vowels have their own modified forms (ă, â, ê, ô, ơ, ư), and there is a crossed đ. On top of that, every syllable carries one of six tones, and five of them are written as marks: acute, grave, hook above, tilde and dot below. A single letter can therefore carry two diacritics at once: ế is an e with a circumflex and an acute. Count every combination and there are 134 precomposed letters, 67 lower case and 67 capitals.

A single-byte character set has 256 slots. Leave ASCII alone, as everyone had to, and 161 remain. That is not enough. Every Vietnamese encoding of the period is a different answer to that one squeeze:

  • VISCII (published as RFC 1456 in 1993) keeps all 134 letters precomposed. It finds the room by taking over six positions normally reserved for control codes.
  • TCVN 5712:1993, Vietnam’s national standard, also called VSCII, borrows control-code positions to fit everything in too. But the fonts most people knew it by, the “.VnTime” family often called TCVN3, leave the toned capitals out. Those capitals live in companion fonts, “.VnTimeH”, where the same bytes draw capitals.
  • VNI stops trying to precompose everything. It stores a base letter followed by a separate tone mark, drawn as a zero-width glyph that lands on the letter before it.
  • VPS, from the Vietnamese Professionals Society, was reportedly the most widespread on the Mac. More on VPS below, because we have not found it.

Four bytes on the disk

  1. 71
  2. 75
  3. E1
  4. 6E

Same bytes. The font decides.

Mac Roman (any modern converter)

  1. q
  2. u
  3. ·
  4. n

“qu·n”

VISCII font on a classic Mac

  1. q
  2. u
  3. á
  4. n

“quán”

The byte 0xE1 is a middle dot in Mac Roman and á in VISCII. A modern converter reads it as Mac Roman, so the meaning is gone before you see the text.

Apple never shipped one

You might expect the Mac to have sorted this out itself. Apple shipped Language Kits for many scripts, and it reserved a script code for Vietnamese. But a reserved number is not a converter. We searched for one, and found nothing at every level:

  • Mac OS 9.2.2. Its Text Encoding Converter is the part of classic Mac OS that does understand Unicode. It lists a converter for Apple’s VT100 terminal encoding, but none for Vietnamese.
  • The Mac OS 9.2.2 Universal CD. Its Language Kits have no Vietnamese script.
  • Apple Language Kit 1.0. Nothing for Vietnamese here either. We checked its checksum against the Internet Archive’s own.
  • Mac OS X 10.4. It knows the name X-MAC-VIETNAMESE and has no table behind it.
  • Modern macOS. Its converter refuses the encoding outright, while converting Mac Roman happily on the same call.
  • Apple’s published mapping tables. Vietnamese is absent.

So Vietnamese on classic Mac OS was never a system encoding at all. It was a font hack. Third-party font vendors took the Mac Roman layout and replaced its glyphs with Vietnamese letters. As far as the System was concerned, the text was Mac Roman. Only the font knew otherwise. Change the font and the meaning goes with it, and every modern converter changes the font.

That gives Disk Phoenix a problem, and it is the kind it exists to solve. Our standing rule is that if the classic software rendered something, we render it too. A Vietnamese letter that the Mac drew correctly in 1996 must not come out as punctuation in 2026.

Searching before search

The obvious move is to find the vendors’ mapping tables. Mostly they were never published. Where they were, they lived on FTP servers and personal web pages from the mid-1990s, and most of that is gone.

  • VPS. The Mac VPS package was distributed as vpsmac211.hqx from MIT’s Vietnet FTP archive. That server no longer serves it, and nobody archived the file.
  • VNI. VNI’s Mac installer, setupmac.sit, was on vnisoft.com mirrors, and none of those copies survive either. What does survive is a 1997 Wayback Machine capture of VNI’s product page for “VNI Tan Ky for Macintosh”. It promises that, with VNI’s own software and fonts installed on both machines, documents move between PC and Mac “without additional software, font sets, or conversion”. It does not say a word about byte positions.

We also had a rule to work within. Converter programs that translate between these encodings do exist, but their tables are other people’s work, and many are GPL. Trace, don’t transcribe: we can use such a table to check our result, but never as the source of it. Every table in Disk Phoenix has to come from a published standard or from watching the original system draw.

That left the fonts themselves. If we could find a genuine 1990s Mac font, we could ask the Mac what it draws.

Asking the Mac

Two finds made the difference.

The TriChlor Group’s VISCII fonts. These are a 1996 package of 14 Mac TrueType faces, which survives on SourceForge. We checked the download against SourceForge’s published checksum. We installed the fonts into Mac OS 9.2.2 running under QEMU, the same way you would have in 1996: drag them onto the System Folder. Then we opened a document holding every byte from 0x00 to 0xFF in SimpleText, set in each face at 24 point, and wrote down what the Mac drew.

That gave the first oracle. The second was independent: each font’s own Macintosh character map, read on the host. Wherever we checked, the system drew exactly the glyph that map selects. Only after both were written down did we compare against RFC 1456. Our identification was not blind, because we had read the RFC earlier, but the byte-by-byte comparison came last.

The result: 133 of 133 letters agree with the standard. The 134th is the interesting one. RFC 1456 puts a capital Y with tilde at 0x19, a control-code slot, and no TriChlor Mac font has a glyph there. On these fonts that byte draws nothing, so we decode it as nothing. We record the gap by name rather than borrowing the standard’s answer for a glyph the Mac never had. In all, 230 bytes are mapped and 26 are not.

The fonts’ own readme claimed three extra Mac-only characters. None of the 14 fonts contains them. That claim is now marked refuted in our provenance ledger, so nobody spends a day re-deriving it.

Oracle 1

What Mac OS 9.2.2 draws

SimpleText, every byte, each font

agree

Oracle 2

The font’s own Mac character map

read on the host

Our table

taken from where the two agree: 230 bytes mapped, 26 not

compared last, as a check

Check only, never a source

RFC 1456

133/133 letters agree; 0x19 has no glyph on the Mac

The table comes from what the Mac drew, confirmed by the font’s own map. The published standard is used only as a check, applied last.

TransPacific Solutions’ TCVN 5712 fonts. These turned up on the Info-Mac V CD-ROM from January 1995, inside a disk image we read with Disk Phoenix itself, resource forks and all. They are a 1994 set of seven Mac faces with two keyboard layouts, and the readme says they follow TCVN 5712:1993. We identified every glyph in one face, Vtimes, and found all 134 Vietnamese letters. Then we compared it with a Windows .VnTime face from an Internet Archive collection of Vietnamese fonts. That collection holds 3,347 font files, 693 of them distinct. At every one of the 74 positions where the Windows face draws a Vietnamese letter, the 1994 Mac font draws the same letter.

The tool that could have done it either way

That agreement looks as though it settles the Mac “.VnTime” question. It does not, and the reason came from a printed manual on Kevin’s shelf.

Most of these fonts were built in Fontographer. The Fontographer 4 User’s Guide, in its chapter on generating fonts, describes an encoding choice. “Original” keeps every glyph where the designer put it. “Macintosh” moves glyphs to wherever their names fall in the Mac Roman layout. So one tool, given one set of drawings, could have produced either layout. Some of the Windows files we measured carry a Mac character map in one layout, and some in the other. Those maps record which button someone pressed, not what the Mac fonts that actually shipped looked like.

So the one Mac vendor we could measure kept the standard positions. Whether the ABC fonts most people actually used for “.VnTime” on the Mac did the same, nobody has yet been able to show us.

Where that leaves us

We record each answer with how sure we are of it, and that matters as much as the answers themselves.

  • VISCII on the Mac: measured. TriChlor’s fonts were drawn by Mac OS 9.2.2 and agree with RFC 1456.
  • TCVN 5712 on the Mac: measured, from TransPacific’s 1994 fonts.
  • “.VnTime” on the Mac: inferred. It reads through the TransPacific table, and every decode carries an inferred label. Kevin approved that knowing the risk: if the ABC Mac fonts were generated with Fontographer’s “Macintosh” setting, the inference is wrong and the label will say so until we replace it.
  • VNI: measured for Windows only. The Mac layout is unknown, and a Mac document set in VNI-Times will not be read with the Windows table by default.
  • VPS: not found. It is named, but has no table.

Where each encoding stands · none of it is in a released app

VISCII Mac
TriChlor fonts (1996), drawn by Mac OS 9.2.2
Measured
TCVN 5712 Mac, TransPacific
TransPacific fonts (1994), Info-Mac V CD-ROM
Measured
.VnTime Mac
Read through the TransPacific table, labelled on every decode
Inferred
VNI
Windows fonts measured; the Mac layout is unknown
Windows measured Mac unknown
VPS
Named, but no table or font found
Not found
Every reading carries the name of the table that made it, and how sure we are of that table. A better source replaces an inferred table without losing anything that was read with it.

The design keeps the bytes as the truth. Each run of text keeps its original bytes, the font it was set in, the Unicode reading, and the identifier of the table that produced the reading. A byte the font never drew is named, not guessed. So when a better table arrives, every document read with the old one can be read again, and nothing has to be recovered from a lossy conversion.

Ta-da. Then we ran the test that matters most: typing Vietnamese on a period Mac and getting the same text out the other side. On Mac OS 9.2.2 under emulation, we installed TransPacific’s 1994 fonts and one of their two keyboard layouts the way a 1994 user would: dragged onto the System Folder, then chosen in the Keyboard control panel. In SimpleText, we typed four lines of Vietnamese through that layout, in Vtimes, and saved the document. That’s a period font, a period keyboard layout and a period application. The Mac stored the text as 106 bytes, one per letter, and its only record of the font is a number.

So Disk Phoenix has to do what the Mac did. It looks that number up among the fonts on the same disk, finds “Vtimes”, reads every byte through the table we measured from that font, and writes the result out as a document a modern Mac understands. TextEdit opens it and shows exactly what SimpleText showed. We checked all 106 characters against the text we meant to type, and they match.

A Mac OS 9 SimpleText window titled ‘Tai lieu Viet’ showing four lines of Vietnamese in a serif font: ‘Xin chào! Đây là một tài liệu tiếng Việt / được soạn trên máy Macintosh cổ điển. / Chữ đẹp, nét đều. / Ở Hà Nội.’ A modern macOS TextEdit window titled ‘Tai lieu Viet.rtfd’ showing the same four lines of Vietnamese, in Times at 24 point.
Left: typed in 1994-era fonts on an emulated Mac running Mac OS 9.2.2. Right: the same document after Disk Phoenix’s development build exported it, open in TextEdit today. TextEdit substitutes Times for Vtimes, but every letter is the one the Mac drew.

The same bytes, read by the font that made them. That’s the whole idea of this post, working once from end to end.

What still does not exist: none of this is in a released app. The tables, and the step that teaches the exporter to use them, are under review and not yet merged. For now it runs only through the command line of our development build. The app’s own Export command doesn’t take this path yet, and plain-text export still ignores the font. The Mac saved our document on its own startup disk, and we copied it onto a test disk image with Disk Phoenix, because our emulator setup could not attach a second writable disk. And VISCII has not had the same test: its period keyboard driver, MacVNKey, survives only as an archive missing its resource fork.

How you can help

This is where the sleuthing stops being something we can do alone. Every question we have left is answered by one artefact that someone, somewhere, still has.

  • Documents. A Vietnamese document created on a classic Mac in the 1990s, in Word, ClarisWorks, PageMaker, QuarkXPress, MacWrite or anything else. One page of real text, with its fonts named, is worth more to us than any converter table. It tells us what people actually typed and what the Mac actually drew.
  • Fonts, as they shipped. VPS for the Mac (vpsmac211.hqx, or any VPS Mac release). VNI’s Mac fonts (setupmac.sit). The ABC “.VnTime” fonts for the Mac. A floppy or CD from the period is better than a later copy, because it shows what users really had.
  • MacVNKey, complete. An archive of it with its resource fork intact, so we can type through it.

If you can help, please get in touch through our contact form. We don’t need to publish anything you send. Fonts and documents are read where they are, as evidence, and are never committed to our code or redistributed; our test files are written by us. We would like to know where something came from, and we will credit you if you want credit.

The letters are still on those disks. Apple never gave them a name. We would like to make sure they are read correctly again.