Hindi text does not work TMPro even when using the Hindi font

I am working on this issue from quite a while now where I am trying to display a Hindi text using a Font specifically made for it.

The problem is that copy-pasting Hindi from Google Translator to the Unity TMPro text does not appear to work since the classic NULL squares are shown.

On the image below you can see what I am talking about:

I did try to set the TMPro Unicode range to 0900–097F since the Hindi font has that range but it doesn’t collect a single character from the file.

I have had the same problem with other languages such as Russian. I did actually solve the problem by adding a specific font and the Unicode range to 401-40C,40E-44F,451-45C,45E-45F,490-491.

Thank you in advance.

I was actually able to fix this thanks to a script I found online.

Before running the script:

After running the script:

The script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;


public class UnicodeToKrutidev {


	private static string[] array_one = new string[] {"‘",   "’",   "“",   "”",   "(",    ")",   "{",    "}",   "=", "।",  "?",  "-",  "µ", "॰", ",", ".", "् ", 
		"०",  "१",  "२",  "३",     "४",   "५",  "६",   "७",   "८",   "९", "x", 

		"फ़्",  "क़",  "ख़",  "ग़", "ज़्", "ज़",  "ड़",  "ढ़",   "फ़",  "य़",  "ऱ",  "ऩ",
		"त्त्",   "त्त",     "क्त",  "दृ",  "कृ",

		"ह्न",  "ह्य",  "हृ",  "ह्म",  "ह्र",  "ह्",   "द्द",  "क्ष्", "क्ष", "त्र्", "त्र","ज्ञ",
		"छ्य",  "ट्य",  "ठ्य",  "ड्य",  "ढ्य", "द्य","द्व",
		"श्र",  "ट्र",    "ड्र",    "ढ्र",    "छ्र",   "क्र",  "फ्र",  "द्र",   "प्र",   "ग्र", "रु",  "रू",
		"्र",

		"ओ",  "औ",  "आ",   "अ",   "ई",   "इ",  "उ",   "ऊ",  "ऐ",  "ए", "ऋ",

		"क्",  "क",  "क्क",  "ख्",   "ख",    "ग्",   "ग",  "घ्",  "घ",    "ङ",
		"चै",   "च्",   "च",   "छ",  "ज्", "ज",   "झ्",  "झ",   "ञ",

		"ट्ट",   "ट्ठ",   "ट",   "ठ",   "ड्ड",   "ड्ढ",  "ड",   "ढ",  "ण्", "ण",  
		"त्",  "त",  "थ्", "थ",  "द्ध",  "द", "ध्", "ध",  "न्",  "न",  

		"प्",  "प",  "फ्", "फ",  "ब्",  "ब", "भ्",  "भ",  "म्",  "म",
		"य्",  "य",  "र",  "ल्", "ल",  "ळ",  "व्",  "व", 
		"श्", "श",  "ष्", "ष",  "स्",   "स",   "ह",     

		"ऑ",   "ॉ",  "ो",   "ौ",   "ा",   "ी",   "ु",   "ू",   "ृ",   "े",   "ै",
		"ं",   "ँ",   "ः",   "ॅ",    "ऽ",  "् ", "्" };

	private static string[] array_two = new string[] {"^", "*",  "Þ", "ß", "¼", "½", "¿", "À", "¾", "A", "\\", "&", "&", "Œ", "]","-","~ ", 
		"å",  "ƒ",  "„",   "…",   "†",   "‡",   "ˆ",   "‰",   "Š",   "‹","Û",

		"¶",   "d",    "[k",  "x",  "T",  "t",   "M+", "<+", "Q",  ";",    "j",   "u",
		"Ù",   "Ùk",   "Dr",    "–",   "—",       

		"à",   "á",    "â",   "ã",   "ºz",  "º",   "í", "{", "{k",  "«", "=","K", 
		"Nî",   "Vî",    "Bî",   "Mî",   "<î", "|","}",
		"J",   "Vª",   "Mª",  "<ªª",  "Nª",   "Ø",  "Ý",   "æ", "ç", "xz", "#", ":",
		"z",

		"vks",  "vkS",  "vk",    "v",   "bZ",  "b",  "m",  "Å",  ",s",  ",",   "_",

		"D",  "d",    "ô",     "[",     "[k",    "X",   "x",  "?",    "?k",   "³", 
		"pkS",  "P",    "p",  "N",   "T",    "t",   "÷",  ">",   "¥",

		"ê",      "ë",      "V",  "B",   "ì",       "ï",     "M",  "<",  ".", ".k",   
		"R",  "r",   "F", "Fk",  ")",    "n", "/",  "/k",  "U", "u",   

		"I",  "i",   "¶", "Q",   "C",  "c",  "H",  "Hk", "E",   "e",
		"¸",   ";",    "j",  "Y",   "y",  "G",  "O",  "o",
		"'", "'k",  "\"", "\"k", "L",   "l",   "g",      

		"v‚",    "‚",    "ks",   "kS",   "k",     "h",    "q",   "w",   "`",    "s",    "S",
		"a",    "¡",    "%",     "W",   "·",   "~ ", "~"};


	public static string  UnicodeToKrutiDev(string unicode_substring){
		int array_one_length = array_one.Length;
		string modified_substring = unicode_substring;

		int position_of_quote = modified_substring.IndexOf("'");
		while (position_of_quote >= 0){ 
			modified_substring =  ReplaceFirstOccurrence(modified_substring,"'","^");
			modified_substring =  ReplaceFirstOccurrence(modified_substring,"'","*");
			position_of_quote = modified_substring.IndexOf("'");
		}

		int position_of_Dquote = modified_substring.IndexOf("\"");
		while (position_of_Dquote >= 0){ 
			modified_substring =  ReplaceFirstOccurrence(modified_substring,"\"","ß");
			modified_substring =  ReplaceFirstOccurrence(modified_substring,"\"","Þ");
			position_of_Dquote = modified_substring.IndexOf("\"");
		}
		// first Replace the two-byte nukta_varNa with corresponding one-byte nukta varNas.

		modified_substring = modified_substring.Replace ( "क़", "क़" ); 
		modified_substring = modified_substring.Replace ( "ख़", "ख़" );
		modified_substring = modified_substring.Replace ( "ग़", "ग़" );
		modified_substring = modified_substring.Replace ( "ज़", "ज़" );
		modified_substring = modified_substring.Replace ( "ड़", "ड़" );
		modified_substring = modified_substring.Replace ( "ढ़", "ढ़" );
		modified_substring = modified_substring.Replace ( "ऩ", "ऩ" );
		modified_substring = modified_substring.Replace ( "फ़", "फ़" );
		modified_substring = modified_substring.Replace ( "य़", "य़" );
		modified_substring = modified_substring.Replace ( "ऱ", "ऱ" );

		// code for replacing "ि" (chhotee ee kii maatraa) with "f"  and correcting its position too.

		var position_of_f = modified_substring.IndexOf( "ि" )  ;
		while ( position_of_f != -1 )  //while-02
		{
			var character_left_to_f = modified_substring[position_of_f - 1];
			modified_substring = modified_substring.Replace( character_left_to_f + "ि" ,  "f" + character_left_to_f )  ;

			position_of_f = position_of_f - 1;

			while (( position_of_f != 0  ) && ( modified_substring[position_of_f - 1] == '्' ) )
			{
				var string_to_be_Replaced = modified_substring[position_of_f - 2 ] + "्"  ;
				modified_substring = modified_substring.Replace( string_to_be_Replaced + "f", "f" + string_to_be_Replaced ) ;

				position_of_f = position_of_f - 2  ;
			}
			position_of_f = modified_substring.IndexOf("ि", position_of_f + 1 ) ; // search for f ahead of the current position.

		} // end of while-02 loop


		//************************************************************     
		//     modified_substring = modified_substring.Replace( /fर्", "£"  )  ;
		//************************************************************     
		// Eliminating "र्" and putting  Z  at proper position for this.

		string set_of_matras = "ािीुूृेैोौं:ँॅ";

		modified_substring += "  ";  // add two spaces after the string to avoid UNDEFINED char in the following code.

		var position_of_half_R = modified_substring.IndexOf( "र्" ) ;
		while ( position_of_half_R > 0  )  // while-04
		{
			// "र्"  is two bytes long
			var probable_position_of_Z = position_of_half_R + 2   ;  

			var character_right_to_probable_position_of_Z = modified_substring[probable_position_of_Z + 1];

			// trying to find non-maatra position right to probable_position_of_Z .

			while ( set_of_matras.IndexOf( character_right_to_probable_position_of_Z ) != -1 )  
			{
				probable_position_of_Z = probable_position_of_Z + 1 ;
				character_right_to_probable_position_of_Z = modified_substring[probable_position_of_Z + 1];
			} // end of while-05

			var string_to_be_Replaced = modified_substring.Substring( position_of_half_R + 2 , ( probable_position_of_Z - position_of_half_R - 1 ))  ;
			modified_substring = modified_substring.Replace( "र्" + string_to_be_Replaced  ,  string_to_be_Replaced + "Z" ) ;
			position_of_half_R = modified_substring.IndexOf( "र्" ) ;
		} // end of while-04

		modified_substring = modified_substring.Substring( 0 , modified_substring.Length - 2 );



		//substitute array_two elements in place of corresponding array_one elements

		for( int input_symbol_idx = 0; input_symbol_idx < array_one_length; input_symbol_idx++ )
		{
			int idx = 0  ;  // index of the symbol being searched for Replacement

			while (idx != -1 ) //whie-00
			{
				modified_substring = modified_substring.Replace (array_one [input_symbol_idx], array_two [input_symbol_idx]);
				idx = modified_substring.IndexOf (array_one [input_symbol_idx]);
			} // end of while-00 loop
		} // end of for loop


		return modified_substring;
	}

	public static string ReplaceFirstOccurrence (string Source, string Find, string Replace)
	{
		int Place = Source.IndexOf(Find);
		string result = Source.Remove(Place, Find.Length).Insert(Place, Replace);
		return result;
	}
}