Why Thai Romanization Is Never Fully Consistent
9 min read · updated August 11, 2026
Two models romanising the same Thai sentence will disagree, and so will the same model twice. The reason is not sampling. It is that the official system maps many Thai words onto one Latin string, so there is no unique answer to converge on.
It is a transcription, not a transliteration
The Royal Thai General System of Transcription, maintained by the Royal Institute of Thailand (now the Royal Society of Thailand) and in its current edition since 1999, is the official romanisation used on road signs and in government material. The word in its name that decides everything is transcription. It renders how a word sounds, not which letters it contains, and it renders the sound incompletely.
Three things it discards on purpose:
- Tone. Thai has five phonemic tones — mid, low, falling, high and rising — and they distinguish words in exactly the way vowels do. The system marks none of them.
- Vowel length. Thai distinguishes short and long vowels phonemically. The system writes both the same.
- Consonant identity. Several Thai letters that map to the same sound map to the same Latin letters, so the spelling of the original is unrecoverable.
Each of those is a many-to-one mapping, and they compose. A given Latin string can correspond to dozens of Thai words. That is not a bug in the standard; a system built for a road sign, to be read by someone who does not speak Thai, has no use for tone marks. It becomes a bug the moment somebody uses the output as a key.
Five words, one spelling
The demonstration every Thai learner meets:
Thai tone meaning RTGS ไม mid (name particle) mai ใหม่ low new mai ไม้ high wood mai ไม่ falling not mai ไหม rising silk / question mai
The sentence ไม้ใหม่ไม่ไหม้ไหม, roughly “does new wood not burn?”, romanises under the standard to mai mai mai mai mai. Every one of those five words is distinct in Thai, in writing and in speech. The romanisation preserves none of the distinctions.
This is why round-tripping fails and why two runs differ. Going Thai to Latin is deterministic if the segmentation is fixed. Going back is a one-to-many choice, and any process that involves a Latin intermediate — a search index keyed on RTGS, a deduplication pass, a model asked to “correct” a romanisation — is choosing among words with no information to choose on. The general failure is set out in what tone marks carry in a tonal language.
Forty-four consonants into twenty-one sounds
The Thai alphabet has forty-four consonant letters for about twenty-one distinct initial consonant sounds, because letters that once differed have merged in pronunciation while remaining distinct in spelling, much as in Greek. The standard maps by sound, so the letters merge:
- ข, ฃ, ค, ฅ, ฆ all become
kh; ก alone isk. - ถ, ท, ธ, ฐ, ฑ, ฒ all become
th; ต and ฏ aret. - ส, ศ, ษ and ซ all become
s. - ช, ฉ and ฌ become
ch, and so does จ — merging an affricate with an aspirated one. - น and ณ become
n; ล and ฬ becomel; ย and ญ becomey.
In final position the collapse is more severe still, because Thai neutralises final consonants to a small set: a great many letters end up as k, t, p, n, m or ng. And Thai writes no spaces between words, so before any of this can be applied the text has to be segmented — a decision that changes the romanisation of the characters around the boundary. Splitting Thai text without word delimiters is the same operation and the same source of run-to-run variance.
If you need reversibility, the standard to reach for is ISO 11940, which is a true transliteration: one Thai character to one Latin sequence, diacritics for tone marks, fully invertible, and completely unreadable to anybody. It is the right choice for a machine key and the wrong one for anything a person sees. The United Nations Group of Experts on Geographical Names maintains reports on the romanisation systems in official use, published through its Working Group on Romanization Systems.
Names ignore the standard entirely
The largest practical source of inconsistency is that Thai proper names are frequently not romanised by the standard at all. Much Thai vocabulary, and most formal personal and place names, comes from Pali and Sanskrit, and the conventional romanisation follows the Sanskrit etymology rather than the Thai pronunciation.
Bangkok’s main airport, สุวรรณภูมิ, is written Suvarnabhumi — a Sanskrit-style spelling. The standard would give Suwannaphum. Both are in use, they share almost no letters, and no rule converts between them. Thai surnames commonly contain silent letters marked with a karan that etymological spellings restore and the standard omits.
So a model asked to romanise a Thai name has to decide which tradition the name belongs to, and that is a knowledge question rather than a rule application. It will get well-known names right, because it has seen them, and it will apply the standard to unfamiliar ones — which is the correct fallback and still produces a spelling the person does not use.
What this forces in a pipeline
- Store Thai script as the canonical field, with the tone marks and vowel diacritics intact. Every Latin form is derived, lossy and regenerable.
- Never join, deduplicate or key on a romanised field. Five distinct records will collapse into one and you will not be able to tell which merges were wrong.
- Record which convention produced each romanisation — standard or conventional — because a name field containing both is otherwise uninterpretable.
- For personal and place names, treat a stored conventional spelling as authoritative and generate a romanisation only where none exists.
- Search over both the Thai and the romanised field, and expect the romanised side to return false positives. Rank Thai-script matches above them.
- Normalise the Thai before comparison. Thai vowel and tone marks are combining characters whose ordering can vary, so two visually identical strings can differ byte for byte.
The thing to accept is that no prompt fixes this. You can pin a standard, and you should, but pinning the standard is what produces mai mai mai mai mai — the standard is the source of the collision. Consistency and fidelity are different goals here, and Thai is the script where you cannot have both.