Unicode typing normalization and keyboard-safe spelling

Correct Hindi typing is not a matter of selecting glyph pictures. Unicode stores an ordered sequence of base letters, dependent vowel signs, virama, nukta, and nasal marks; a shaping engine then draws the visible syllable. Two strings can look identical while differing internally, and one misplaced or invisible character can break search, collation, text-to-speech, or spell-checking.

This page uses NFC normalization, genuine Devanagari code points, and default shaping. The advice applies whether you type with InScript, a phonetic keyboard, transliteration input, or a mobile layout: input method is personal, but the stored Hindi spelling must remain interoperable. Review the underlying cluster mechanism on the virama page.

Think in logical characters, not screen positions

Dependent signs are typed after the base or cluster they belong to, even when a font displays them elsewhere. The classic example is कि: its logical order is क + ि, although ि appears to the left. A conjunct follows the same logic: क्रि is क + ् + र + ि.

Visible formLogical componentsReading
किक + िki
कीक + ीkī
क्रिक + ् + र + िkri
हिंदीह + ि + ं + द + ीhindī
फ़्लैटफ + ़ + ् + ल + ै + टflaiṭ

हमने नया फ़्लैट किराए पर लिया है।

hamne nayā flaiṭ kirāe par liyā hai.

We've rented a new apartment.

कृपया हिंदी में संदेश लिखिए।

kripyā hindī meṃ sandeś likhie.

Please write the message in Hindi.

If you attempt to type where a mark appears visually, you may produce a malformed sequence or a mark attached to the wrong base. Let the shaping engine reorder the display.

💡
For pre-base ि, type the consonant or full conjunct first and the vowel sign second. “Looks left” never means “stored first.”

NFC and nukta sequences

Nukta ़ follows its base consonant and precedes a virama or vowel sign: क़ = क + ़, फ़ = फ + ़, ड़ = ड + ़. Unicode also contains legacy single code points for several nukta letters, but they have canonical decompositions. Under NFC, the interoperable form is the base consonant plus U+093C nukta.

For example, the legacy code point named DEVANAGARI LETTER QA (U+0958) normalizes to क + ़. The display may be indistinguishable, yet raw string comparison can fail if software skips normalization. Normalize at input boundaries and before equality checks; do not assume visual identity proves byte identity.

फ़ाइल खुल गई, लेकिन नाम अभी भी ग़लत है।

fāil khul gaī, lekin nām abhī bhī ġalat hai.

The file opened, but the name is still wrong.

लड़की सड़क के उस पार खड़ी है।

laṛkī saṛak ke us pār khaṛī hai.

The girl is standing across the road.

The flaps ड़/ढ़ are romanized ṛ/ṛh, while the vowel sign ृ is modern Hindi ri. Keeping these categories separate prevents a common digital error: treating a visual dot or curl as a generic diacritic rather than part of a specific encoded sequence.

A minimal nukta contrast

Nukta can distinguish words. राज rāj means “rule/reign,” while राज़ rāz means “secret.” The difference is ज / ज़, not stylistic decoration.

उस राजा ने दस साल राज किया।

us rājā ne das sāl rāj kiyā.

That king ruled for ten years.

यह बात राज़ ही रहेगी।

yah bāt rāz hī rahegī.

This matter will remain a secret.

In casual typing, some writers omit nukta from familiar loans, and search systems may deliberately fold the distinction. A grammar reference must still preserve standard contrastive spelling. Search tolerance and correct source text are different engineering decisions.

Virama, conjuncts, and shaping controls

The default cluster sequence is C₁ + U+094D + C₂. A font may display a half-form, ligature, stack, or visible halant according to its design. Do not insert a space to “help” the font: क् ष contains a word-breaking space, whereas क्ष is the uninterrupted sequence क + ् + ष.

ZWJ (zero-width joiner) and ZWNJ (zero-width non-joiner) can request particular shaping behavior in specialized contexts (technical/typographic). They are invisible, survive normalization, and make strings different. Ordinary Hindi prose, learning content, identifiers, and search keys should not contain them merely to force a favorite glyph.

कृपया प्रश्न का उत्तर स्पष्ट शब्दों में लिखिए।

kripyā praśn kā uttar spaṣṭ śabdoṃ meṃ likhie.

Please write the answer to the question in clear words.

इस चिह्न का आकार दूसरे फ़ॉन्ट में थोड़ा अलग है।

is cihn kā ākār dūsre fonṭ meṃ thoṛā alag hai.

The shape of this symbol is slightly different in another font.

The second sentence states a core Unicode principle: different glyphs can represent the same text. Font variation is not license to respell the word.

Nasal signs and combining-mark order

Anusvara ं and chandrabindu ँ are different characters. They follow the vowel-bearing unit: हिंदी contains ि + ं, while माँ contains ा + ँ. Nukta belongs to the consonant; nasal marks belong to the syllable or vowel. Careless copying can detach a mark or attach it to the wrong base even if a forgiving font produces something readable.

मैंने माँ को हिंदी में संदेश भेजा।

maĩne mā̃ ko hindī meṃ sandeś bhejā.

I sent Mom a message in Hindi.

संदेश में साफ़ नहीं लिखा है कि कहाँ जाना है।

sandeś meṃ sāf nahīṃ likhā hai ki kahā̃ jānā hai.

The message doesn't clearly say where to go.

NFC does not decide whether a word needs anusvara, chandrabindu, or an explicit nasal consonant. Normalization makes canonically equivalent encodings consistent; it cannot repair a linguistically wrong character.

Visually similar characters are not substitutes

Several dangerous lookalikes cross scripts or punctuation systems:

Required characterCommon wrong substituteWhy it matters
ः visarga: ASCII colondifferent character and function
। danda| vertical bar or Latin Idifferent sentence segmentation
० Devanagari zeroO Latin capital Oletter rather than digit
१ Devanagari onel or ILatin letter rather than digit
़ nuktaperiod or manually positioned dotnot attached canonically to the consonant

Substitution can be more than cosmetic. Usernames, filenames, dictionary keys, and automated assessment may treat the strings as unrelated. If text behaves strangely, inspect code points rather than trusting the rendered screenshot.

Word spelling still depends on Hindi knowledge

Unicode can guarantee a well-formed sequence while the word remains misspelled or misread. It cannot infer that कमरा is kamrā, that प्रश्न is praśn, or that लड़की contains the lexical flap ड़. Do not add a virama merely to imitate schwa deletion, and do not delete a conjunct because a font makes it unfamiliar.

सही वर्तनी लिखने के बाद भी उच्चारण जाँचना ज़रूरी है।

sahī vartanī likhne ke bād bhī uccāraṇ jā̃cnā zarūrī hai.

Even after writing the correct spelling, checking the pronunciation is necessary. (formal)

Grammar also survives normalization. In लड़कियों ने, the base लड़की takes the oblique plural ending -यों before ने; neither normalization nor font shaping changes that morphology.

लड़कियों ने अपनी फ़ाइलें समय पर भेज दीं।

laṛkiyoṃ ne apnī fāileṃ samay par bhej dīṃ.

The girls sent their files on time.

💡
Normalization solves encoding equivalence, not language. A robust workflow needs both: NFC for stable strings and lexical/morphological checking for correct Hindi.

A keyboard-safe workflow

  1. Use a Unicode Hindi keyboard or reputable transliteration input method.
  2. Type logical characters, not copied glyph fragments.
  3. Normalize saved text to NFC.
  4. Reject or review unexpected ZWJ, ZWNJ, zero-width spaces, and nonbreaking spaces.
  5. Check nukta, virama, anusvara, chandrabindu, and visarga explicitly.
  6. Test search and copy-paste in a second font or application.
  7. Proofread words and morphology; normalization cannot do that job.

A short reading line

कृपया फ़ाइल का सही नाम लिखकर संदेश भेजें; शब्द और चिह्न दोनों जाँच लें।

kripyā fāil kā sahī nām likhkar sandeś bhejeṃ; śabd aur cihn donoṃ jā̃c leṃ.

Please send the message after entering the correct filename; check both the words and the symbols.

The line contains nukta, conjuncts, anusvara, and chandrabindu. A valid Unicode sequence makes it portable; fluent reading still requires fāil, likhkar, śabd, and cihn, with the appropriate schwa deletion.

Common Mistakes

1. Using an ASCII colon for visarga

❌ पंजीकरण नि:शुल्क होगा।

Incorrect — the mark after नि is ASCII colon, not Devanagari visarga.

✅ पंजीकरण निःशुल्क होगा।

pañjīkaraṇ niḥśulk hogā.

Registration will be free of charge. (formal)

2. Omitting a required nukta

❌ वह सीढ़ियों से नीचे पडा।

Incorrect — the perfective of पड़ना requires the flap letter ड़ in पड़ा.

✅ वह सीढ़ियों से नीचे पड़ा।

vah sīṛhiyoṃ se nīce paṛā.

He fell down the stairs.

3. Dropping the nasal mark from a pronoun

❌ मै अभी घर पर हूँ।

Incorrect — the first-person pronoun is मैं with anusvara.

✅ मैं अभी घर पर हूँ।

maĩ abhī ghar par hū̃.

I'm at home right now.

4. Inserting a space inside a conjunct

❌ कृपया प्र श्न पढ़िए।

Incorrect — the space breaks the conjunct and the word प्रश्न.

✅ कृपया प्रश्न पढ़िए।

kripyā praśn paṛhie.

Please read the question.

Key Takeaways

  • Type Devanagari in logical character order and let the font handle visual reordering.
  • Normalize to NFC; legacy nukta letters canonically decompose to base + U+093C.
  • Avoid unnecessary ZWJ, ZWNJ, and invisible spaces in ordinary Hindi text.
  • Never replace visarga, danda, digits, or combining marks with Latin lookalikes.
  • Unicode well-formedness, correct spelling, morphology, conjunct parsing, and schwa deletion are distinct layers, and reliable Hindi text needs all of them.

Now practice Hindi

Reading grammar gets you part of the way. The exercises are where it sticks — free, no signup needed.

Start learning Hindi →

Related Topics