前言:最近的有個項目是要讀取泰文然後將泰文疊加到圖片上。查了一週的資料,所有的流程已經走通了。
泰文排版規則
泰文是一種拼音文字,有128個字符,有效的87個字符 字庫表。41個保留位。有元音、輔音和音調之分。拼寫上可以形象的分爲鞋子、主體、帽子、聲調、獨立字符、標點符號。
- 鞋子字符 它可以疊加在主體字符的下面,就像給主體字符穿的鞋子一樣。
- 主體字符 它上面可以疊加帽子字符,下面可以疊加鞋子字符,就像給它帶上帽子,穿上鞋子一樣。
- 帽子字符 它可以疊加在主體字符的下面,就像給主體字符帶上帽子一樣。
- 聲調字符 它是一個詞語的聲調,必須疊放在主體字符或帽子字符上面。
- 獨立字符 它是不可以穿鞋子,不可以帶帽子,也不可以加聲調的一類字符。
- 標點符號 它是用來斷句的標點符號,和其他語言中的標點符號的功能一樣。
具體泰文排版規則看上篇博文:https://blog.csdn.net/ma950924/article/details/104555948
實現原理
想要將泰文疊加到圖片上需要兩個步驟:
- 泰文轉成unicode編碼: 泰文實際上是utf-8編碼的,這也就是編譯器以utf-8的格式纔可以正常顯示泰文的原因。
- 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的步驟及實現原理。