Patrick Moling
Patrick Moling

Reputation: 145

Hindi text does not work with 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:

NiriHindiIssue

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 have tried:

Upvotes: 0

Views: 302

Answers (1)

Patrick Moling
Patrick Moling

Reputation: 145

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

Before running the script:

issue1

After running the script:

issue2

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;
    }
}

Upvotes: 0

Related Questions