泰文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的步骤及实现原理。

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