嵌入式Linux系统的电子书阅读器项目3——Encode & Font System

1.字符编码(Encode)与字体(Font)显示概述

如图1,大家在阅读器界面看到的不同字体和尺寸的"好"字(左边宋体小二,右边楷体小二),在电子书txt格式文档中的原始数据是如何存储的呢?

图1 左边宋体小二,右边楷体小二

实际上,采用不同编码格式,其表示方法是不同的,以下是四种常用编码格式的表示方法。

utf8: 0xE5A5BD

utf16-le: 0x7D59

utf16-be: 0x597D

ascii/gbk:0xBAC3

关于这四种常用编码方式的基本规则和概念,在此不详细介绍了,

有兴趣的爱好者可以看看阮一峰老师的这篇博客:

各种字符编码格式简介

但自此说明的是,我把gbk和ascii码放在一起,是因为ascii本身只是标准英文字符集编码,是不包含汉字的,

gbk是在ascii字符集之后,按照相应规则,扩充了汉字库,并完全包含了ascii字符集(有点C和C++ 语法集的关系)。

但是gbk并不是国际通用汉字标准,只是中国大陆地区自制的编码标准,所以才有gbk编码的文本,容易出现乱码现象,

可能需要转换成unicode码才能互相传输显示(另外,港台汉字采用big-5编码)。

一个txt文档里的原始文字变成屏幕上显示的各种字体和大小的字符的过程如图2所示。通过基本概念的解释,

让爱好者意识,显示的字体和编码的字符是不同的基本概念,接下将详细介绍编码和字体系统的框架。

图2 原始txt文本编码数据到显示在屏幕上的字体转换过程

2.字符编码系统(Encode System) 架构与API

1).系统框架

字符编码系统由核心层与各个组件部分,其架构图如图3所示。每个组件都是可装载卸载的,即系统不需要实现所有组件,仅需要激活一个组件就能使用该组件在组件指定的特性和范围中运行,本项目其它子系统都是采用这种可装载卸载组件的方法架构和设计的。

图3 字符编码系统框架

Encode System core:

字符编码系统的核心层,用于封装字符编码相关的复杂业务逻辑与数据交换,Book Engine通过输入原始txt文档文件,由Encode system内部组件自动匹配对应的编码格式,然后选用对应的解码格式化组件,无法匹配的字符编码格式文件将返回错误。

 2). API简介

encode system 相关头文件在include/encode.h中声明。

encode:

编码系统核心结构描述符encode 声明如下:

typedef struct encode{
	char *name;
	struct encode_attr attr;
	int (*is_support)(char *file_buf_head);
	int (*get_fmtcode_frm_buf)(__u8 *curr_addr, __u8 *buf_end, __u32 *fmtcode);
	struct encode *next;
}encode;
所支持的encode格式编码器,通过next指针链表挂接,可以通过name的值(如:utf8) 从加载激活的encode链表

中获取。

attr:

encode 的属性attr包含了该encode对应编码格式所能自动识别的txt文件该编码前缀长度head_len(如:utf8格式文件头长度),

以及suppt_font_h,表示编码encode支持适配的的字体字模库的链表,并非每钟编码方式都能能支持所有的字库字模,本项目

编码格式所能支持的字体字模库对应表如表1所示。

表1 encode所支持的font对应关系表

is_support():

通过读取文件前head_len个字符,自动识别文件的编码格式,来选择自动对应的encode

get_fmtcode_frm_buf():

从已识别编码格式的文件中,获取经过unicode格式化的字符编码,系统可以unicode格式化后的字符编码到font

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值