Tamil Collation in GLIBC

A  few months back, we started fixing the collation rules of Indian languages in GNU C library. Pravin Satpute prepared patches for many languages and I prepared patches for Malayalam and Tamil. Later Pravin enhanced the Tamil patch.

You can read the rules used for Malayalam collation here[PDF document]. Tamil patch was applied to upstream, but the bug is still open since there is some confusion on the results.

Before reading the below discussion, please read the discussion happened in the bug report : [ta_IN] Tamil collation rules are not working in other locales

Since many Tamil friends can give valuable comments on this, I am giving an explanation for my patch here. K Sethu gave some interestin his comments on the patch and I would like to hear from others also. Since collation is a very important component on Tamil support, I feel that an open discussion and consensus  should happen among language speakers outside bug trackers.

This is the logic used currently in Tamil and Malayalam Collation rules also follow the same logic.

  1. Consider each consonant as pure consonant + implicit a vowel. ie க= க் + அ   and த= த்+ அ
  2. Similarly கா = க்+ ஆ, தி = த்+ இ
  3. From #1 and #2, க் < க, த்< த , We get this output for example:அ
    அக்
    அகம்
    அகால
    அக்கம
    அக்கு
    But K Sethu questions this order in his comment here.According to him
    ( consonant1+ virma+ consonant2 ) < ( consonant1+ vowel + [consonant2] )
    or The correct sequence should be அ, அக், அக்கம், அக்கு, அகம், அகால
    But as per my patch
    ( consonant1+ virma+ consonant2 ) > ( consonant1+ vowel + [consontant2] )
    ie, all conjuncts for consonant1 happens after all consonant1+vowel + * sequences.
    So let me try to explain this behaviour.
  4. let us take க்த and கத:க்த = க்+ த்+ அ
    கத = க்+ அ+ த்+ அ
    considering the weight comparison logic(decreasing weight from left to right)
    this comparison becomes between
    க்+ த்+ அ and க்+ அ+ த்+ அ
    since க் is common in first weight, removing it. so it becomes
    த்+ அ and அ+ த்+ அ
    Since த் > அ
    த்+ அ > அ+ த்+ அ
    and there by
    க்த > கத
    So conjuncts comes after the cosonant+vowel pairs. hence the result given in #3

Apart from these, equal weights are assigned for ோ (0BCB), ௌ (0BCC), and their canonical equivalent forms.

If anybody interested in testing the patch, get ta_IN and iso14651_t1_common files from here, back up those file in /usr/share/i18n/locales, and place these two files there. reconfigure your locale using “sudo dpkg-reconfigure locales”. Sort some random file using “LANG=ta_IN sort yourfile”. If your distro is not debian based, follow the instructions from here

There is an easy way to test this. Silpa project provides an online application for Indic language collation. You can try it from here. It is a Unicode Collation algorithm implementation. The Unicode collation definition has many mistakes but we have a patched version. You can compare the results between original and patched version.

Feel free to inform this discussion to anybody interested on Tamil Computing. I would be happy to help in the implementation if we  reach  a consensus.


Yahoo search bug

None of the search engines can handle Indian languages very well. Google removes the zero width joiners, non joiners , that are used in many languages. Yahoo doesnot remove it. But a UI bug in webpage makes the results wrong..
See the below image:

The bottom half of the image is the source code. We can clearly see that the closing bold tag is placed in between the word instead of putting at the end of the word. As a result, the word is rendered wrong in the page.
This happens for all languages which use ZWJ, ZWNJ, ZWS etc. It breaks the word just before the zwnj/zwj and puts the end of bold tag to highlight the search result..

I showed this to Gopal and told me that he filed a bug on that.

വരമൊഴിയിലും മൊഴി കീമാനിലും എന്‍കോഡിങ്ങ് ബഗ്ഗുകള്‍

വരമൊഴിയിലും മൊഴി കീമാനിലും ( Tavultesoft keyboard) എന്‍കോഡിങ്ങ് പിശകുകള്‍. മലയാളം വിക്കിപ്പീഡിയയിലുള്ള മൊഴി കീമാപ്പിലും ഈ പിശക് ഉണ്ട്. വാക്കുകളുടെ യൂണിക്കോഡ് കോഡ് മൂല്യങ്ങളുടെ വിന്യാസത്തിലാണ് പിശക്. അനാവശ്യമായ ZWNJ ആണ് പ്രശ്നം

കുറച്ച് ഉദാഹരണങ്ങളിലൂടെ ഇത് വിശദമാക്കാം.
മൊഴി

പൊന്‍നിലാവ് (pon_nilaav): ഈ വാക്കിന്റെ ആന്തരിക യൂണിക്കോഡ് റെപ്രസന്റേഷന്‍ എന്താണെന്നറിയാന്‍ പൈത്തണ്‍ പ്രോഗ്രാമ്മിങ്ങ് ഭാഷ ഉപയോഗിക്കാം.

>>>str=u”പൊന്‍‌നിലാവ്”
>>>print repr(str)
u’\u0d2a\u0d4a\u0d28\u0d4d\u200d\u200c\u0d28\u0d3f\u0d32\u0d3e\u0d35\u0d4d’

\u200c(ZWNJ) എന്ന കോഡ് ഇവിടെ അനാവശ്യമാണ്. പൊന്‍നിലാവ് എന്ന വാക്കിന്റെ യഥാര്‍ത്ഥ യൂണിക്കോഡ് ശ്രേണി ഇതാണ്:
u’\u0d2a\u0d4a\u0d28\u0d4d\u200d\u0d28\u0d3f\u0d32\u0d3e\u0d35\u0d4d’

ഇത്തരത്തിലുള്ള മറ്റു ചില വാക്കുകളിതാ:(മൊഴി കീമാന്‍ ഉപയോഗിച്ചെഴുതിയത്)- വാക്കുകള്‍ക്കിടയില്‍ ചില്ലക്ഷരം വരുന്നവ:
മുന്‍‌തൂക്കം, എന്‍‌കോഡിംഗ്, ചാരന്‍‌മാരാണ് ,നന്‍‌മ,പാന്‍‌ഗോ,പിന്‍‌താങ്ങുന്നുവെന്നു,പിന്‍‌തിരിയണമെന്നും,പിന്‍‌പക്കത്തില്‍,പിന്‍‌വലിഞ്ഞു ,പൊന്‍‌വീണ,പൗരന്‍‌മാര്‍,മന്‍‌മോഹന്‍,മുന്‍‌കൂട്ടി,മുന്‍‌കൈ,
മുന്‍‌ഗണനകള്‍, മുന്‍‌ധാരണകളില്ലാതെ, മുന്‍‌വിധികളും, റേഷന്‍‌കാര്‍ഡിനും,സല്‍മാന്‍‌ഖാനും,സെന്‍‌ട്രല്‍ , താല്‍‌പര്യം, ഉല്‍‌പന്നം, കല്‍‌പിച്ച്,നല്‍‌കാനും, മേല്‍‌വിവരിച്ച, വില്‍‌ക്കപ്പെടുന്ന, ശില്‍‌പശാല, ലോസ്ഏഞ്ചല്‍‌സ്, കണ്‍‌വഴി, കണ്‍‌വെട്ടം , പൊന്‍നാളം, കല്‍വിളക്ക്‌
താല്‍‌പര്യം = thaal_paryam

>>> str=u”താല്‍‌പര്യം”
>>> print repr(str)
u’\u0d24\u0d3e\u0d32\u0d4d\u200d\u200c\u0d2a\u0d30\u0d4d\u0d2f\u0d02′

ZWNJ പക്ഷേ ZWJ (U+200D) എന്നതിന് ശേഷം ഇടേണ്ട കാര്യമില്ല . ZWJ ഉള്ളതുകൊണ്ട് തുടര്‍ന്നു വരുന്ന അക്ഷരങ്ങളുമായുള്ള കൂടിച്ചേരല്‍ സംഭവിക്കില്ല. മൊഴിയുടെ അല്‍ഗോരിതം എന്തുകൊണ്ടോ ZWNJ യും ഇടുന്നു.
അതായത് വാക്കുകള്‍ക്കിടയില്‍ മാത്രമല്ല , ചില്ലക്ഷരമെഴുതാന്‍ n, l, L, r,R,N എന്നിവക്ക് പകരം എവിടെയൊക്കെ l_, n_,L_, r_,R_ ,N_ എന്നിവ ഉപയോഗിക്കുന്നുവോ അവിടെയെല്ലാം എന്‍കോഡിങ്ങ് പിശകാണ്. മൊഴി സ്കീമില്‍ l_, n_,L_, r_,R_ ,N_ എന്നിവയാണ് ചില്ലക്ഷരങ്ങള്‍ക്ക് ഉപയോഗിക്കേണ്ടത് എന്ന് പറഞ്ഞിരിക്കുന്നു.

ഈ ഉദാഹരണം ശ്രദ്ധിക്കൂ
അവള്‍= avaL_

>>> str=u”അവള്‍‌”
>>> print repr(str)
u’\u0d05\u0d35\u0d33\u0d4d\u200d\u200c’

അവസാനമുള്ള ZWNJ (u+200C) ശ്രദ്ധിക്കുക. ഈ “അവള്‍ ” ഒരിക്കലും തിരഞ്ഞാല്‍ കിട്ടാത്തവളാണെന്ന് വ്യക്തമാണല്ലോ.

ഈ പ്രശ്നം സിബു http://varamozhi.wikia.com/wiki/Help:Contents/Known_Problems
എന്ന പേജില് ചേര്‍ത്തിട്ടുണ്ട്.

മലയാളം സ്പെല്ലിങ്ങ് ചെക്കറിന്റെ ചില പരീക്ഷണങ്ങള്‍ക്കിടയിലാണ് ഈ ബഗ്ഗ് എന്റെ ശ്രദ്ധയില്‍ പെട്ടത്. ചില വാക്കുകള്‍ എപ്പോളും സ്പെല്ലിങ്ങ് മിസ്റ്റേക്ക് കാണിക്കുന്നതിന്റെ കാരണം അന്വേഷിച്ചപ്പോള്‍ കണ്ടെത്തിയതാണിത്. സ്പെല്ലിങ്ങ് ചെക്കറിനായി ഞാന്‍ ശേഖരിച്ച പദശേഖരത്തില്‍ ഇത്തരത്തിലുള്ള ഏതാനും വാക്കുകള്‍ കയറിക്കൂടിയിട്ടുണ്ട്. വിക്കിയിലോ ബ്ലോഗുകളിലോ, മൊഴിയോ വരമൊഴിയോ ഉപയോഗിച്ചെഴുതിയ വാക്കുകളാകണം.

വരമൊഴിയിലും ബഗ്ഗ്

http://varamozhi.wikia.com/wiki/Help:Contents/Mozhi എന്ന വിക്കി താളില്‍ പറഞ്ഞിരിക്കുന്നു:
‘പിന്‍നിലാവ്‌’ എന്ന വാക്കു ശ്രദ്ധിക്കൂ. മംഗ്ലീഷില്‍ pinnilaav~ എന്നാണെഴുതേണ്ടത്‌ എന്നാവും ആദ്യം തോന്നുക. പക്ഷെ, കമ്പ്യൂട്ടറിനൊരു സംശയമുണ്ടാവും; അതിനെ ‘പിന്നിലാവ്‌’ എന്ന്‌ വായിച്ചാലെന്തെന്ന്‌. സംശയം ന്യായമാണ്‌. ഈയൊരു ആശയക്കുഴപ്പത്തിനിടയാക്കാത്ത വിധം പ്രശ്നം തീര്‍ക്കുന്നതിനാണ്‌ ‘_’ (underscore) എന്ന Zero Width Space (ZWS) – വലിപ്പമില്ലാ ചിഹ്നം.

ഇവിടെ ZWS എന്നത് ഒരു അനാവശ്യ യുണിക്കോഡ് കോഡ് മൂല്യമല്ലേ? ZWS ഇല്ലാതെ തന്നെ പിന്‍നിലാവ് എന്ന് എഴുതാനും പറ്റും. ZWS ഇടേണ്ടിവരുന്നത് സോഫ്റ്റ്‌വെയറിലെ ബഗ്ഗ് മൂലമല്ലേ? ഇനി വേറൊന്ന് :

വരമൊഴി ഉപയോഗിച്ച് ഞാന്‍ എന്റെ പേര് എഴുതി നോക്കി. സന്തോഷ് =santhOsh

>>> str=u”സന്തോഷ്‌”
>>> print repr(str)
u’\u0d38\u0d28\u0d4d\u0d24\u0d4b\u0d37\u0d4d\u200c

വാക്കിന്റെ അവസാനമുള്ള ZWNJ ശ്രദ്ധിക്കുക.
ഇന്‍സ്ക്രിപ്റ്റ് ഉപയോഗിച്ച് സന്തോഷ് എന്നെഴുതിയപ്പോള്‍:

>>> str=u”സന്തോഷ്‌”
>>> print repr(str)
u’\u0d38\u0d28\u0d4d\u0d24\u0d4b\u0d37\u0d4d’

വരമൊഴി ഉപയോഗിച്ച് പൊന്‍നിലാവ് എഴുതുമ്പോള്‍:

>>>str=u”പൊന്‍നിലാവ്‌”
>>>print repr(str)
u’\u0d2a\u0d4a\u0d28\u0d4d\u200d\u0d28\u0d3f\u0d32\u0d3e\u0d35\u0d4d\u200c

അവന് avan~

>>> str=u”അവന്‌”
>>> print repr(str)
u’\u0d05\u0d35\u0d28\u0d4d\u200c

മേല്‍പറഞ്ഞ ഉദാഹരണങ്ങളില്‍ \u0d4d (ചന്ദ്രക്കല) എന്നതിന് ശേഷം \u200c വരുന്നതെങ്ങനെ?
മൊഴിയിലെഴുതിയതും , വരമൊഴിയിലെഴുതിയതും, ഇന്‍സ്ക്രിപ്റ്റിലെഴുതിയതുമായ പൊന്‍നിലാവ്‌ എന്ന വാക്കിന് 3 എന്‍കോഡിങ്ങ്! അതായത് കമ്പ്യൂട്ടറിനെ സംബന്ധിച്ചിടത്തോളം മൂന്നും മൂന്ന് മലയാളം വാക്കുകള്‍!

ഈ ബഗ്ഗുകളെല്ലാം സിബുവിനെയും പെരിങ്ങോടനെയും അറിയിച്ചിട്ടുണ്ട്. ബഗ്ഗാണെന്നാണ് അവരും അംഗീകരിച്ചു.
അവരുമായുള്ള ഈ മെയില്‍ സംവാദത്തില്‍ നിന്ന് :

പെരിങ്ങോടന്‍:
മൊഴിയാണെങ്കില്‍ ~ ഉപയോഗിക്കുന്നത്

1. ഒരു വാക്കിനു നടുവില്‍ ആണെങ്കില്‍ അടുത്തുവരുന്ന അക്ഷരത്തെ ചന്ദ്രക്കല ഉള്ള തൊട്ടുമുമ്പിലെ അക്ഷരവുമായി കൂട്ടിച്ചേര്‍ക്കുവാന്‍ ആഗ്രഹിക്കുന്നില്ല എന്ന അസമ്പ്ഷന്‍
2. ഒരു വാക്കിനു അവസാനത്തിലാണെങ്കില്‍ ചന്ദ്രക്കലയ്ക്കു പകരം ചില്ലുരൂപങ്ങള്‍ വരുന്ന വാക്കുകളില്‍ ചന്ദ്രക്കല സൂചിപ്പിക്കുവാന്‍ (സന്തോഷ് എന്നെഴുതുവാന്‍ santhOsh എന്നുമതി, അവസാനത്തെ ~ ആവശ്യമില്ല, അവന്‌ എന്നെഴുതുവാന്‍ ~ ആവശ്യമുണ്ട്)

ഇവിടെ രണ്ടാമത്തെ ഉപയോഗത്തില്‍ ഒരു ബഗ്ഗുണ്ട്, വാക്കുകള്‍ക്കു നടുവില്‍ ചന്ദ്രക്കല എഴുതുമ്പോള്‍ ഇടുന്ന ZWNJ വാക്കുകള്‍ക്കു അവസാനവും വന്ന് പോകുന്നുണ്ട്, ഒരാള്‍ എഴുതിക്കൊണ്ടിരിക്കുമ്പോള്‍ അത് വാക്കിന്റെ അവസാനമോ എന്ന് ഊഹിക്കുവാന്‍ കഴിയാത്തതില്‍ ആണത്. എന്നാല്‍ ZWNJ + Space -> Space എന്നൊരു റൂള്‍ ഉണ്ടെങ്കില്‍ ഈ പ്രശ്നം ഒഴിവാക്കുകയും ചെയ്യാം (or any other special character assuming user will type those special character to resume typing, cibu has already pointed out this bug, I was reluctant to fix it considering a normal user perspective)
സിബു:
“ആവശ്യമില്ലാത്ത zwnj മുഴുവന്‍ ഒഴിവാക്കാന്‍ പറ്റും എന്നെനിക്ക്‌ പ്രതീക്ഷയില്ല. ath~ എന്നൊരാളെഴുതിയാല്‍ വരമൊഴി അവസാനം കൊണ്ടുപോയി zwnj ഇടും. അതാണ് യൂസര്‍ ആഗ്രഹിക്കുന്നത്‌ എന്നാണ് എന്റെ അനുമാനം. കാരണം അതുകഴിഞ്ഞുവരുന്ന ക്യാരക്റ്റര്‍ ‘ത’യുമായി കൂട്ടക്ഷരമുണ്ടാക്കരുത്‌ എന്നുദ്ദേശിച്ചിട്ടാവും അങ്ങനെ യൂസറിട്ടതെന്ന്‌ വരമൊഴി കരുതുന്നു.
എന്നാല്‍ zwj, zwnj കോമ്പിനേഷന്റെ ആവശ്യം ഒന്നുമില്ലെന്നാണ് എനിക്ക്‌ തോന്നുന്നത്‌. അവിടെ zwnj പറ്റുമെങ്കില്‍ ഒഴിവാക്കാവുന്നതാണ്.”

സന്തോഷ് :
പക്ഷേ സന്തോഷ് എന്നെഴുതാന് ഞാന് ~ ഉപയോഗിച്ചില്ല. santhOsh എന്നാണ്
എഴുതിയത്. അപ്പോള് അതിന്റെ അറ്റത്ത് zwnj വരുന്നതെങ്ങനെ എന്ന്
വിശദീകരിക്കാമോ?

സിബു:
നോക്കി. ശരിയാണ് അവസാനം ഒരു ZWNJ വരുന്നുണ്ട്. അത്‌ ഒരു വരമൊഴി ബഗ് തന്നെ. ശരിയാക്കാന്‍ എന്തുമാത്രം എളുപ്പമാണ് എന്നറിഞ്ഞുകൂടാ എന്നു മാത്രം.

ഈ എന്‍കോഡിങ്ങ് പിശകുകളുടെ ഗൗരവം ഞാന്‍ പറയാതെ തന്നെ നിങ്ങള്‍ക്ക് ബോദ്ധ്യപ്പെട്ടുവെന്നു കരുതുന്നു. മലയാളം വിക്കിപ്പീഡിയയില്‍ തെറ്റായ എന്‍കോഡിങ്ങ് ഉള്ള മലയാളം പദങ്ങള്‍ കടന്നു കൂടിയിരിക്കുന്നു. അതു പോലെ ബ്ലോഗുകളിലും, എവിടെയെല്ലാം വരമൊഴിയോ, മൊഴി കീമാനോ ഉപയോഗിച്ചുവോ അവിടെയെല്ലാം പിശകുകള്‍ കാണാനുള്ള സാധ്യത വളരെയധികമാണ്. പ്രത്യേകിച്ചും ബ്ലോഗേഴ്സിന്റെ ഇടയില്‍ വരമൊഴിയുടെ പ്രചാരം നോക്കുമ്പോള്‍.

മലയാളം എന്‍കോഡിങ്ങ് ഇന്‍സ്ക്രിപ്റ്റിനെയാണ് പ്രമാണമാക്കേണ്ടത്. നിവേശകരീതി ഏതായാലും അന്തര്‍ലീനമായ എന്‍കോഡിങ്ങ് ഒന്നായാലേ ഏതൊരു സോഫ്റ്റ്‌വെയറിനും അവയെ കൈകാര്യം ചെയ്യാനാകൂ. മൊഴി കീമാന് എന്‍‌കോഡിങ്ങ് എന്ന വാക്കു തന്നെ തെറ്റായേ എഴുതാനാകൂ.
ഇന്‍സ്ക്രിപ്റ്റ് ഉപയോഗിച്ച് ഒരു രചനയില്‍ ഞാന്‍ എന്റെ പേരെഴുതി എന്നിരിക്കട്ടെ. വരമൊഴി ഉപയോഗിച്ചെഴുതിയ “സന്തോഷ്” എന്ന വാക്ക് ആ രചനയില്‍ തിരഞ്ഞാല്‍ കിട്ടില്ല. Notepad ലോ , Gedit ലോ പരീക്ഷിച്ച് നോക്കൂ.

അതുകൊണ്ട്:
1. ഭാഷയില്‍ ഈ പ്രശ്നങ്ങള്‍ ഇനിയും കടന്നു കൂടാതിരിക്കാന്‍ മേല്‍ പറഞ്ഞ ബഗ്ഗുകള്‍ അടിയന്തിരമായി തിരുത്തേണ്ടതുണ്ട്. തെറ്റിയ അല്ഗോരിതം ഏതാണെന്ന് വ്യക്തമാക്കിയാല്‍ എല്ലാവര്‍ക്കും സഹായിക്കാന്‍ സാധിച്ചേക്കും.
2. ഇപ്പോള്‍ കടന്ന് കൂടിയ ബഗ്ഗുകള്‍ എങ്ങനെ തിരുത്തണമെന്ന് നാം ആലോചിക്കേണ്ടിയിരിക്കുന്നു.(വിക്കിപ്പീഡിയയില്‍ ഒരു ബോട്ട് ഉപയോഗിക്കേണ്ടി വന്നേക്കും എന്നാണ് സിബു എന്നോട് പറഞ്ഞത്. അതിന്റെ പ്രായോഗികതയെപറ്റി ചിന്തിക്കേണ്ടിയിരിക്കുന്നു.)
3. പുതിതായി വരുന്നതും ഇപ്പോളുള്ളതുമായ നിവേശകരീതികള്‍ സൂക്ഷ്മമായ എന്‍‌കോഡിങ്ങ് ടെസ്റ്റിന്‍ വിധേയമാക്കണം. അതിന് ശേഷമേ പബ്ലിക് റിലീസ് പാടുള്ളൂ.