前言:最近的有个项目是要读取泰文然后将泰文叠加到图片上。查了一周的资料,所有的流程已经走通了。
泰文排版规则
泰文是一种拼音文字,有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的步骤及实现原理。