泰文utf-8轉unicode編碼實現

前言:最近的有個項目是要讀取泰文然後將泰文疊加到圖片上。查了一週的資料,所有的流程已經走通了。

泰文排版規則

泰文是一種拼音文字,有128個字符,有效的87個字符 字庫表。41個保留位。有元音、輔音和音調之分。拼寫上可以形象的分爲鞋子、主體、帽子、聲調、獨立字符、標點符號。

  1. 鞋子字符 它可以疊加在主體字符的下面,就像給主體字符穿的鞋子一樣。
  2. 主體字符 它上面可以疊加帽子字符,下面可以疊加鞋子字符,就像給它帶上帽子,穿上鞋子一樣。
  3. 帽子字符 它可以疊加在主體字符的下面,就像給主體字符帶上帽子一樣。
  4. 聲調字符 它是一個詞語的聲調,必須疊放在主體字符或帽子字符上面。
  5. 獨立字符 它是不可以穿鞋子,不可以帶帽子,也不可以加聲調的一類字符。
  6. 標點符號 它是用來斷句的標點符號,和其他語言中的標點符號的功能一樣。
    具體泰文排版規則看上篇博文:https://blog.csdn.net/ma950924/article/details/104555948

實現原理

想要將泰文疊加到圖片上需要兩個步驟:

  1. 泰文轉成unicode編碼: 泰文實際上是utf-8編碼的,這也就是編譯器以utf-8的格式纔可以正常顯示泰文的原因。
  2. unicode編碼轉成泰文並進行圖片疊加: 泰文渲染是採用了freetype第三方庫進行顯示的,freetype需要的是unicode編碼,這也就是爲什麼泰文要先轉化爲unicode編碼的原因。

步驟一:泰文utf-8轉unicode

泰文的unicode編碼範圍是0E00-0E7F,UTF-8將這段範圍的字符用三個字節表示。然後如果一個字符後面跟了鞋子和帽子,UTF-8就會將後面的鞋子和帽子與主體組成一體,所以就可以造成一個字符有9個字節的情況。泰文是不是有點小變態(強行吐槽一波)。
比如泰文字符"ผผูผู้",這三個字符的拼寫是主體、主體+鞋子和主體+鞋子+帽子。
‘ผ’對應的UTF-8編碼是:E0B89C
‘ผู‘對應的UTF-8編碼是:E0B89C E0B8B9
‘ผู้’對應的UTF-8編碼是:E0B89C E0B8B9 E0B989
大家可以發現泰文的UTF-8編碼規則是主體+鞋子+帽子。

UTF-8有點類似於Haffman編碼,它將Unicode編碼爲:
0x00-0x7F的字符,用單個字節來表示;
0x80-0x7FF的字符用兩個字節表示;
0x800-0xFFFF的字符用3字節表示;
漢字的unicode範圍是:0x4E00~0x9FA5
其實這個範圍還包括了中,日,韓的字符。

泰文有效字符(有保留未使用字符)utf-8編碼範圍是0xE0B880 - 0xE0B99B,Unicode編碼範圍是0x0E00-0x0E5B,兩者有一一對應的關係。所以我使用的方法是見了兩個數組存放泰文utf-8編碼和unicode編碼數據。接收到utf8字符後,組合在utf-8數組裏找到對應的數據然後按照索引在unicode編碼數組裏找到泰文對應的unicode數據。例如:一串泰文字符"ผผูผู้",他的utf-8編碼數據是0xe0b89c, 0xe0b89c, 0xe0b8b9, 0xe0b89c, 0xe0b8b9, 0xe0b989。對應的unicode碼是:0xe1c, 0xe1c, 0xe39, 0xe1c, 0xe39, 0xe49。
相關實現代碼

Uint32 Utf8_To_Unicode(Uint8 *src)
{
    Uint8 Ch, Ch1, Ch2;
    Uint32 unicode;
    Uint32 temp, idx, i;

    Ch = src[idx];
    Ch1 = src[idx+1];
    Ch2 = src[idx+2];
    temp = Ch<<16 | Ch1<<8 | Ch2;
    
    for(i=0; i<=87; i++)
    {
        if(temp == Thai_Utf8[i])
        {
            unicode = Thai_Unicode[i];
        }
            
    }
    
    return unicode;
}   

完整代碼鏈接(資源提交中,審覈之後給出):

步驟二:調用freetype進行文字渲染疊加

這個步驟是我同事給我接口直接調用的,我自己這兩天剛開始接觸學習,調用的步驟就是初始化庫、裝載一個字體、設置大小等等, 詳細內容後面在新寫一篇博文具體詳細介紹freetype的步驟及實現原理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章