recovery汉化实现

仅当作学习笔记。

步骤:

1.制作字库

首先制作汉字的图片字库,可使用bitmap font generator软件制作,然后用利用GIMP图片编辑器把图片字库转换为C源文件,最后利用得到的C文件与minui/mkfont.c文件一起编译,执行后就会得到字库头文件。注意修改结构体名以及相应cwidth和cheight(字符长宽)。

2.修改代码

用刚才制作的字库头文件替换原有的字库头文件,然后修改graphics.c文件, 添加两个函数,并修改gr_text函数,所有修改如下:

[cpp]  view plain copy
  1. int getGBCharID(unsigned c1, unsigned c2)  
  2. {  
  3.     if (c1 >= 0xB0 && c1 <=0xF7 && c2>=0xA1 && c2<=0xFE)  
  4.     {  
  5.         return (c1-0xB0)*94+c2-0xA1;  
  6.     }  
  7.     return -1;  
  8. }  
  9.   
  10. int getUNICharID(unsigned short unicode)  
  11. {  
  12.     int i;  
  13.     for (i = 0; i < UNICODE_NUM; i++) {  
  14.         if (unicode == unicodemap[i]) return i;  
  15.     }  
  16.     return -1;  
  17. }  
  18.   
  19. int gr_text(int x, int y, const char *s)  
  20. {  
  21.     GGLContext *gl = gr_context;  
  22.     GRFont *font = gr_font;  
  23.     unsigned off;  
  24.     unsigned off2;  
  25.     unsigned off3;  
  26.     int id;  
  27.     unsigned short unicode;  
  28.   
  29.     y -= font->ascent;  
  30.   
  31.     gl->bindTexture(gl, &font->texture);  
  32.     gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE);  
  33.     gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);  
  34.     gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE);  
  35.     gl->enable(gl, GGL_TEXTURE_2D);  
  36.   
  37.     while((off = *s++)) {  
  38.         if (off < 0x80)  
  39.         {  
  40.             off -= 32;  
  41.             if (off < 96) {  
  42.                 if ((x + cw_en) >= gr_fb_width()) return x;  
  43.                 gl->texCoord2i(gl, (off * font->cwidth) - x, 0 - y);  
  44.                 gl->recti(gl, x, y, x + cw_en, y + font->cheight);  
  45.             }  
  46.             x += cw_en;  
  47.         }  
  48.         else  
  49.         {  
  50.             if ((off & 0xF0) == 0xE0)  
  51.             {  
  52.                 off2 = *s++;  
  53.                 off3 = *s++;  
  54.                 unicode = (off & 0x1F) << 12;  
  55.                 unicode |= (off2 & 0x3F) << 6;  
  56.                 unicode |= (off3 & 0x3F);  
  57.                 id = getUNICharID(unicode);  
  58.                 //LOGI("%X %X %X  %X  %d", off, off2, off3, unicode, id);  
  59.                 if (id >= 0) {  
  60.                     if ((x + font->cwidth) >= gr_fb_width()) return x;  
  61.                     gl->texCoord2i(gl, ((id % 96) * font->cwidth) - x, (id / 96 + 1) * font->cheight - y);  
  62.                     gl->recti(gl, x, y, x + font->cwidth, y + font->cheight);  
  63.                     x += font->cwidth;  
  64.                 } else {  
  65.                     x += font->cwidth;  
  66.                 }  
  67.             } else {  
  68.                 x += cw_en;  
  69.             }  
  70.         }  
  71.     }  
  72.   
  73.     return x;  
  74. }  

至此,汉化完成。

一个注意点,含有汉字显示的文件要保存为GB2312格式,保存为UTF-8会显示异常。

其实已经有人实现了汉化并上传到了github,上述代码修改也是参考github上的代码完成的。

github地址为:https://github.com/xiaolu/cmw_recovery_cn.git

开源万岁!


另外,补充一些基础知识。

ASCII、GB2312、Unicode、UTF8
ASCII
ASCII(美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。 
后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-16626.png
图 1 ASCII表
GB2312
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
它是计算机可以识别的编码,适用于汉字处理、汉字通信等系统之间的信息交换。基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。
每个汉字也都有在GB2312中的区位码,用两个字节表示。
汉字编码范围,区码:B0 ~ F7,位码:A1 ~ FE
汉字编码后续标准如,GB18030, 对GB2312完全兼容。
code  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
B0A0     啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘
B0B0  鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翱
B0C0  袄 傲 奥 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋
B0D0  靶 把 耙 坝 霸 罢 爸 白 柏 百 摆 佰 败 拜 稗 斑
B0E0  班 搬 扳 般 颁 板 版 扮 拌 伴 瓣 半 办 绊 邦 帮
B0F0  梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤 苞 胞 包 褒 剥   
...
...
...
code  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
F7A0     鳌 鳍 鳎 鳏 鳐 鳓 鳔 鳕 鳗 鳘 鳙 鳜 鳝 鳟 鳢
F7B0  靼 鞅 鞑 鞒 鞔 鞯 鞫 鞣 鞲 鞴 骱 骰 骷 鹘 骶 骺
F7C0  骼 髁 髀 髅 髂 髋 髌 髑 魅 魃 魇 魉 魈 魍 魑 飨
F7D0  餍 餮 饕 饔 髟 髡 髦 髯 髫 髻 髭 髹 鬈 鬏 鬓 鬟
F7E0  鬣 麽 麾 縻 麂 麇 麈 麋 麒 鏖 麝 麟 黛 黜 黝 黠
F7F0  黟 黢 黩 黧 黥 黪 黯 鼢 鼬 鼯 鼹 鼷 鼽 鼾 齄   
unicode
通用字符集
UTF8
可变长编码,汉字3字节表示。具体可参考RFC3629。
D2BB  4E00  E4 B8 80  一
B6A1  4E01  E4 B8 81  丁
C6DF  4E03  E4 B8 83  七
CDF2  4E07  E4 B8 87  万
D5C9  4E08  E4 B8 88  丈
C8FD  4E09  E4 B8 89  三
C9CF  4E0A  E4 B8 8A  上
CFC2  4E0B  E4 B8 8B  下
D8A2  4E0C  E4 B8 8C  丌
...
...
...
F6B8  9F88  E9 BE 88  龈
F6B9  9F89  E9 BE 89  龉
F6BA  9F8A  E9 BE 8A  龊
C8A3  9F8B  E9 BE 8B  龋
F6BB  9F8C  E9 BE 8C  龌
C1FA  9F99  E9 BE 99  龙
B9A8  9F9A  E9 BE 9A  龚
EDE8  9F9B  E9 BE 9B  龛
B9EA  9F9F  E9 BE 9F  龟
D9DF  9FA0  E9 BE A0  龠


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值