前言:最近的有个项目是要读取泰文然后将泰文叠加到图片上。查了一周的资料,所有的流程已经走通了。
一、实现原理
想要将泰文叠加到图片上需要两个步骤:
- 泰文转成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 *s