Cyrillic to Latin Transliteration Standards Compared
10 min read · updated August 11, 2026
A model given a list of Russian surnames can return Zhukovskiy on one line and Žukovskij on the next. Neither is an error. They are two different published standards answering two different questions, and the list is unusable because it contains both.
Two jobs, which is why there are many systems
Every Cyrillic romanisation standard is a compromise between two goals that cannot both be maximised.
The first is reversibility. One Cyrillic letter maps to exactly one Latin sequence, and the mapping can be inverted with no information lost. This requires letters the Latin alphabet does not have, so it produces diacritics — ž, č, š, ŝ — and output that an English reader cannot pronounce.
The second is readability. An English-speaking reader should be able to approximate the sound. This needs digraphs — zh, ch, sh, shch — which are ASCII and familiar, and which destroy reversibility, because now sh could be one letter ш or the two letters сх, and y is doing duty for both й and ы.
Nothing resolves that. A system is built for cataloguers, or for cartographers, or for machine round-tripping, and the standards multiplied because those consumers exist simultaneously. A model has read documents produced under all of them and will drift between them across a long output, because within any single sentence each is a plausible continuation.
One name through five standards
The composer Чайковский is a useful test string because it contains four of the contested letters: ч, й, с and ий at the end.
ISO 9:1995 Cajkovskij (c = c-caron, j for the short i) GOST 7.79-2000 sys B Chajkovskij (ASCII digraphs, j kept) BGN/PCGN 1947 Chaykovskiy (reader-oriented, no diacritics) ALA-LC Chaikovskii (with a tie bar over the ii) Common English usage Tchaikovsky (French-mediated, no standard at all)
The last line is the one that matters commercially, because it is what a user types. “Tchaikovsky” came into English through French, where tch was needed to spell the ч sound, and no romanisation standard produces it. A search index built on any of the four standards above will not match the spelling on the record sleeve.
The systems themselves, briefly and by what they optimise for:
- ISO 9:1995 — issued by the International Organization for Standardization. A single table covering every Cyrillic language at once, one letter to one letter, fully reversible, heavy with diacritics. Written for machines and bibliographic exchange, not for readers.
- GOST 7.79-2000 — the Russian interstate standard. It has two systems: System A is ISO 9, and System B replaces the diacritics with ASCII digraphs and apostrophes (
ыasy’,эase’,щasshh,хasx). System B is reversible and ASCII, at the cost of looking like nothing anybody writes. - BGN/PCGN — the joint system of the United States Board on Geographic Names and the Permanent Committee on Geographical Names for British Official Use. Built for maps and English prose: digraphs, no diacritics in ordinary use, and deliberately not reversible.
- ALA-LC — the American Library Association and Library of Congress romanisation tables, used in catalogue records. Reversible in principle, using tie bars over digraphs to mark that they represent one character.
Which ones you can invert
If you plan to store only the Latin form and reconstruct the Cyrillic later, this is the section that decides your schema. ISO 9 and GOST System B invert cleanly. BGN/PCGN does not, and the reason is worth understanding because it is the same reason in every non-reversible system: two source letters share one target. In BGN/PCGN Russian, both й and ы become y. Given Chaykovskiy there is no rule that recovers which y was which.
Serbian is the interesting case, because Serbian is not really being romanised at all. It is written in two official alphabets, Cyrillic and Gaj’s Latin, and they are in exact one-to-one correspondence — this is a script conversion, not a transliteration, and it should be lossless. It is not quite, and the exception is famous: the Latin digraphs lj, nj and dž each correspond to a single Cyrillic letter (љ, њ, џ), so a word where those two letters happen to meet across a morpheme boundary converts back wrongly. nadživeti is nad + živeti and must return надживети, but a naive mapping produces наџивети. injekcija must return инјекција and naively produces ињекција.
A model handles these correctly more often than a lookup table does, for the same reason it handles Chinese polyphonic surnames: it has the word, not just the letters. But it handles them correctly sometimes, and if the round trip has to be exact, use a converter with a morpheme exception list rather than a probabilistic one.
The national systems
Several countries legislate their own, and where one exists it generally wins for names of people and places from that country, regardless of what ISO says.
- Ukraine uses the national system adopted by the Cabinet of Ministers in 2010, in which
гishrather thang— the single most visible difference from any Russian-oriented table, and the reason Ukrainian names transliterated by a Russian standard look wrong to Ukrainian readers. See the 2010 Ukrainian standard and what it replaced. - Bulgaria passed a Transliteration Act in 2009 fixing an official streamlined system:
хishand notkh,ъisa,щissht, and a word-final-ияis written-ia, which is why the capital isSofiaand notSofiya. - Serbia and Macedonia have official Latin alphabets rather than romanisation systems, as described above.
- Russia uses the ICAO table on machine-readable travel documents, which differs from all of the above and is what a passport actually prints — the passport spelling and the natural one are rarely the same string.
The practical consequence is that “transliterate this Cyrillic name” is under-specified in a second way beyond the standard: the correct answer depends on which language the Cyrillic is, and the same letter sequence can be a Russian name or a Ukrainian one. Tell the model the language.
Pinning a standard in a prompt
Naming the standard alone is not reliably enough. Standards are documents a model has read about rather than tables it has memorised perfectly, and the contested letters are exactly the ones where a half-remembered table drifts. Name the standard and give the rows that differ.
SYSTEM
Transliterate Russian Cyrillic to Latin using BGN/PCGN (1947).
Use exactly this table for the contested letters; do not substitute
any other system's forms:
е=e ё=e ж=zh й=y х=kh ц=ts ч=ch ш=sh щ=shch
ы=y э=e ю=yu я=ya ъ and ь are omitted
Never emit a character outside ASCII. If you cannot map a character,
output it unchanged and add it to an "unmapped" array.
Output JSON: [ { "cyrillic": "...", "latin": "..." } ]The last instruction is the one that turns a silent failure into a visible one. A model that meets a letter it has no rule for will otherwise invent something plausible, and an invented mapping in row four hundred of a batch is indistinguishable from a correct one unless you asked it to tell you.
Validate the output rather than trusting it: assert that every character is ASCII, assert that no output contains a character from a system you did not ask for (a ž or a č means ISO 9 leaked in), and spot-check the letters in the table above. And keep the Cyrillic. Whatever standard you chose, the original is the only field that has not lost anything.