1.用unicode码显示中文
int chin[] = {0x97e6,0x4e1c,0x5c71,0x0067}; //韦东山g
定义要显示的中文,然后显示,这样的方法是可以的。
中文在unicode编码中是两个字符,英文是一个字符,所以用以上方法是正确的,因为显示时是一个字符一个字符输入进去转换再显示的,而如果这样写:
char chin[]="韦东山g";
就会出现乱码,原因如下:
0x97e6 0x4e1c 0x5c71 0x0067
韦东山g的unicode码,共占用了7个字节,所以chin数组有7个元素
而下面是一个一个元素输入进去转换再显示,所以0x97和0xe6就会被分开,认为是两个字符,所以出现了乱码。
即使我们在程序上做处理,但是我们并不能分清哪些是中文(两个字符),哪些是英文(一个字符)。
2.宽字符:wchar_t
如果用char存储汉字英文等,则还需要判断数据类型,而wchar_t刚好可以放一个unicode字符
注意:wchar_t在windows占2byte,在linux占4bytes.
宽字符:wchar_t
头文件: #include<wchar.h>
通过wcslen()判断wchar_t数组大小
#include<wchar.h>
wchar_t *chinese_str = L"韦东山g"; //定义一个宽字符地址指向这个字符串
wcslen(chinese_str); //计算chines_str指向几个字符
实验:
直接编译出现 转换字符集 的错误
我们在编写的时候用的是ANSI码,就是GBK
而输出的使需要UTF-8
需要在编译的时候指定输入文件字符集和输出文件字符集:
gcc -finput-charset=GBK -fexec-charset=UTF-8 -o ansi ansi.c
执行结果:
和之前手工输入的编码是一样的。
3.字符显示超出基准线
添加打印一下行号后得出的结果如下
我们代码中定义的坐标是(0,40),而实际上很多字都会超出一点。
freetype库中有这么一张图片:
字母的一部分会超出基线一点。
在汉字中,都在原点上面是没有问题的,但是一些英文字母比如g等,都会在基线下面,所以为了兼容所有语言文字,就会把字拉倒基线下面一点,如上图所示。
上图中,xMin表示该字符在x坐标最小处,同理xMax,yMax,yMin。
adevance是本字符的大小,下个字符的位置就是本字符的原点加上advance,程序如下:
pen.x += slot->advance.x; //pen是下个字符的原点信息
pen.y += slot->advance.y;
这个advance.x 和 advance.y应该是在之前设置角度那个函数 (FT_Set_Transform( face, &matrix, &pen ); ) 中设置的,这样即使是想旋转显示(如下图),也一样使用这两行代码就行。
4.获取位图文字的信息
- 添加头文件
#include FT_GLYPH_H
- 通过F_Get_Glyph()将一个字形图像(face->glyph)存到FT_Glyph类型的变量中
- 再通过FT_Glyph_Get_CBox()获得bbox,bbox里面有信息,代码如下
FT_BBox bbox; //这里面存着 xMin yMin xMax yMax
FT_Glyph glyph;
//设置字用不用旋转和开始显示的位置
FT_Set_Transform( face, &matrix, &pen );
//转换为点阵
error = FT_Load_Char( face, wst[n], FT_LOAD_RENDER );
//通过字符编码,获取字形图像存到face->glyph里,并转为位图存到face->glyph->bitmap->buffer[]里
//error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NORMAL )
error = FT_Get_Glyph( face->glyph, &glyph ); //将字形图像(face->glyph)存到glyph里
//获得FT_BBox ,即获得xMin...等四个元素。 无返回值
FT_Glyph_Get_CBox(glyph,FT_GLYPH_BBOX_TRUNCATE,&bbox);
//做一下显示
printf("Unicode:0x%x\n",wst[n]);
printf("lcd_x:%d , lcd_y=%d \n ",slot->bitmap_left,target_height - slot->bitmap_top);
printf("xMin = %d, xMax = %d\n",bbox.xMin,bbox.xMax);
//根据位图信息画点
draw_bitmap( &slot->bitmap, //位图存在的地方 &slot->bitmap = &face->glyph->bitmap->buffer
slot->bitmap_left, //x坐标
target_height - slot->bitmap_top ); //y坐标