中老年人补钙吃什么牌子的钙片好| 娟五行属什么| 犀利是什么意思| 为什么丰胸霜一抹就变大| 红斑狼疮复发的症状是什么| abo什么意思| 甲沟炎是什么原因引起的| 支原体培养及药敏是检查什么| 付字五行属什么| 99年属什么生肖| primark是什么牌子| 吥是什么意思| 1月30日什么星座| 什么是假性高血压| 谛听是什么意思| 小针刀是什么手术| 唾液臭是什么原因| 强直性脊柱炎是什么病| 结节性硬化症是什么病| 蓦然是什么意思| 第三代身份证什么时候开始办理| 晚饭吃什么英语怎么说| 轻描淡写是什么意思| 礼五行属什么| 中午吃什么减肥| 什么是树莓| 前列腺液是什么颜色| 早晨醒来口苦是什么原因| 头发软是什么原因| 釜底抽薪是什么意思| 什么是三观不合| 二甲双胍有什么副作用| 猪肝吃多了有什么坏处| 凝胶是什么| 心电图能查出什么| 血红蛋白偏低吃什么补| 维生素B1有什么副作用| 大夫古代指什么| 角鲨烯有什么作用| 藏红花泡水喝有什么功效和作用| 熬药用什么锅熬最好| 蔓越莓有什么功效| 男人前列腺炎有什么症状表现| 肾衰竭吃什么水果好| 米干是什么| 漂洗是什么意思| 多春鱼为什么全是籽| kdj是什么意思| 肾功能不全吃什么药| 卵巢增大是什么原因引起的| 失眠多梦用什么药| 梅菜是什么菜晒干的| 产妇吃什么水果好| 妈妈姐姐的女儿叫什么| 珉字五行属什么| 对牛弹琴代表什么生肖| 意大利用的什么货币| 6月份是什么星座| 吃汤圆是什么节日| 春天能干什么| 柔式按摩是什么意思| 2月13号是什么星座| 25分贝相当于什么声音| 血小板太高会导致什么| 美食家是什么意思| 围绝经期是什么意思| 肚子有硬块是什么原因| 月经期间适合吃什么| 2028年属什么| 门对门有什么说法| 分泌物过氧化氢阳性是什么意思| 头孢过敏用什么药代替| 猫鼻支什么症状| 现在什么最赚钱| 三堂会审是什么意思| 手心朝上是什么意思| 6月20号是什么星座| 胃不好早餐吃什么好| 米其林什么意思| 公顷是什么意思| 红糖大枣水有什么功效| 环切是什么意思| 花生什么时候种| 繁什么似锦| 什么的变化| 钟表挂在客厅什么位置好| 女性下面水少是什么原因| 孕妇能吃什么水果| 梅毒rpr是什么| 12320是什么电话| 溥仪和慈禧什么关系| 伏羲是什么意思| 草字头加西念什么| 脑梗做什么检查| 吃过期药有什么危害| 薛定谔的猫比喻什么| 摘胆对身体有什么影响| 脚冰凉吃什么药| 枸杞和红枣泡水喝有什么好处| 数不胜数的胜是什么意思| 什么屎不臭| 花对什么| 平顶山为什么叫平顶山| 主动脉钙化什么意思| s标志的运动鞋是什么牌子| 吃完饭就拉肚子是什么原因| 风向标是什么意思| 机械性窒息死亡是什么意思| 白头发吃什么变黑| iga是什么意思| 第一次表白送什么花| 什么时候容易怀孕| 韧带和筋有什么区别| 桃花什么生肖| 小孩吃什么能长高| 串串是什么意思| 睡觉盗汗是什么原因| 红参和人参有什么区别| 鸡胸挂什么科| 头皮起疙瘩是什么原因| 雌二醇高说明什么| 冠脉壁钙化是什么意思| 虎都男装属于什么档次| 随餐吃是什么意思| 西安香烟有什么牌子| 奶泡是什么| 色彩斑斓是什么意思| 内热是什么意思| 扁平足是什么样子图片| 潜血弱阳性是什么意思| 大便稀溏是什么意思| 支付宝账号是什么| 一个点是什么意思| 一岁半宝宝反复发烧是什么原因| 掉头发是缺什么| 什么症状要查心肌酶| 浮肿是什么原因引起的| t代表什么| 特别嗜睡是什么原因| 左肖是什么生肖| 什么的世界| 眼底出血用什么眼药水最好| 拉黑色大便是什么原因| 熟地黄是什么| 杏和什么不能一起吃| 肝肾两虚吃什么中成药| 凝聚力是什么意思| 嫡传弟子是什么意思| 什么的小朋友填词语| 567是什么意思| 星期一左眼皮跳是什么预兆| 缺陷的陷是什么意思| espresso是什么咖啡| 腿软无力是什么原因| 高校自主招生是什么意思| 钡餐检查能查出什么| 人中有痣代表什么| 为什么刚小便完又有尿意| 随诊什么意思| 桃子什么季节成熟| 室早三联律是什么意思| 104是什么意思| 胸口堵是什么原因| 一九三九年属什么生肖| 奇脉见于什么病| 碉堡是什么意思啊| 指疣是什么病| 月经期头疼是什么原因| 生津止渴是什么意思| g50是什么高速| 办理结婚证需要什么材料| 氯化钠注射液是什么| 国家电网需要什么专业| 甲醛什么味道| 阻力是什么意思| 囊肿里面是什么东西| 稍纵即逝什么意思| 什么安全套好用| 婧五行属什么| 什么是闰月| 来月经吃什么对身体好| 一岁半宝宝反复发烧是什么原因| girl什么意思| 为什么老是梦到男朋友| jimmychoo是什么牌子| 颈椎病有什么症状| 香蕉为什么不能放冰箱| 口比念什么| 强碱是什么| 梦到掉头发是什么意思| 宝宝囟门什么时候闭合| 艾灸灸出水泡是什么情况| 高血压1级是什么意思| 梦见抓螃蟹是什么征兆| 月痨病是什么病| 此言差矣是什么意思| 胃胀气是什么症状| 特派员是什么级别| 风寒感冒和风热感冒有什么区别| 奶粉可以做什么美食| 人为什么会咳嗽| 笃什么意思| 过度是什么意思| 梦见麒麟是什么兆头| 幽门螺旋杆菌吃什么药| 尿等待吃什么药最好| 经常早上肚子疼是什么原因| 在五行中属什么| 用什么泡脚可以去湿气| 四月二十四是什么星座| 辐射对称是什么意思| 职业暴露是什么意思| 龋齿和蛀牙有什么区别| 吃了就吐是什么原因| 忧心忡忡是什么意思| 十月二十七是什么星座| 法国鳄鱼属于什么档次| 苏轼是什么派诗人| 菠萝蜜什么季节成熟| 12月13号什么星座| 颈椎不舒服挂什么科| lps医学上是什么意思| 八月三日是什么星座| 什么是微单相机| 口力念什么| 不什么思什么| 灰指甲应该挂什么科室| 类风湿是什么原因引起的| 性生活时间短吃什么药| 室间隔缺损是什么意思| 小腿浮肿吃什么药最好| 辣椒是什么生肖| 固体玉米糖浆是什么| 出现血尿是什么原因| 荷叶和山楂一起泡水有什么功效| 双侧卵巢显示不清是什么意思| 不约什么什么| 开封有什么好玩的地方| 兵马俑在什么地方| 猪肉馅饺子配什么菜| ono是什么意思| 空囊是什么原因造成的| 梦见喝水是什么意思| 承五行属性是什么| 葳蕤是什么意思| 9月份是什么季节| 心理学属于什么学科| 预谋什么意思| 休止期脱发什么意思| 做梦梦见生孩子是什么意思| 车厘子和樱桃什么区别| 兔子的耳朵像什么| 平安扣适合什么人戴| 避孕套什么牌子好用又安全| 纯碱是什么| 左边肋骨下面是什么器官| 阿玛尼算什么档次| 百无一用是什么意思| 胃反酸是什么原因造成的| 食用香精是什么| 月子吃什么最下奶| 山药不能和什么一起吃| 鳕鱼是什么鱼| 荨麻疹擦什么药膏| 百度

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2075|回复: 0
打印 上一主题 下一主题
收起左侧

“网红”教师和他的手工世界 中国人也能做解谜书

[复制链接]
跳转到指定楼层
楼主
ID:107189 发表于 2016-3-6 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Directfb 的DrawString其实支持中文显示,不过只支持utf-8编码,所以主要的问题就是让
把我们常用的gb2312编码转换成utf-8编码。其实是有现成的函数可以转换的,只是库比
较大,所以还是自己实现吧。

首先得把gb2312转换成Unicode,然后再把Unicode转换成utf-8。gb2312转换成Unicode
比较容易,windows下有个函数MultiByteToWideChar可以实现,我们可以利用这个函数
生成一个数组,以后用的时候直接查表就可以了。下边是生成表的代码。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
    wchar_t wstr[8] = {0};
    FILE *fp;
    unsigned char rowCode,colCode;
    char szStr[64] = {0};
    char szBuff[2] = {0};
    unsigned char row;
    unsigned char col;
    fp = fopen("GB2Uni_LUT.h", "w+, ccs=UNICODE");
    if(fp)
    {
        strcpy( szStr, "unsigned short Unicode[87][94]={\n");
        fwrite(szStr,1,strlen(szStr),fp);
        for(row = 0; row < 87; row++)
        {
            for(col = 0; col < 94; col++)
            {
                rowCode = row + 0xA1;
                colCode = col + 0xA1;
                szBuff[0] = rowCode;
                szBuff[1] = colCode;
                if( MultiByteToWideChar(CP_THREAD_ACP,MB_ERR_INVALID_CHARS,szBuff,2,wstr,8))
                {
                    sprintf(szStr,"0x%04X,",wstr[0]);
                    fwrite(szStr,1,strlen(szStr),fp);
                }
                else
                {
                    fwrite( "0x0000,", 1, 13, fp );  
                }
            }
            fwrite( "\n", 1, 1, fp );
        }
        strcpy( szStr, "};\n");
        fwrite( szStr, 1, strlen( szStr ), fp );
        fclose(fp);
    }
    return 0;
}
然后就可以考虑Unicode转换成utf-8了,理解起来比较麻烦,代码实现比较简单,
原理参照另一篇日志Unicode,UTF8等编码规范[转]。
下面是gb2312转utf-8的代码实现。
int GB2UTF_8(char *p_desStr, char *p_srcStr)
{
int x ,y;
short s_Temp = 0;
char chighChar = 0;
char clowChar = 0;
assert(p_srcStr);
assert(p_desStr);
while ('\0' != *p_srcStr)
{
  if(((unsigned char)*(p_srcStr))>=0xA0)
  {
   //gb2312转unicode
   chighChar = *p_srcStr-0xA1;//大端序
   clowChar = *(p_srcStr+1)-0xA1;//
   x = (int)chighChar;
   y = (int)clowChar;
   s_Temp = Unicode[x][y];//取unicode编码
   //unicode转utf-8
   chighChar = (0xff00&s_Temp)>>8;
   clowChar = (0x00ff&s_Temp);
   char cTemp[3];
   cTemp[0] = 0xE0 | ((0xF0 & chighChar)>>4);
   cTemp[1] = 0x80 | (((0x0F & chighChar)<<2) | ((0xC0 & clowChar)>>6));
   cTemp[2] = 0x80 | (0x3F & clowChar);
   memcpy(p_desStr,cTemp,sizeof(cTemp));
   p_desStr += 3;                    
   p_srcStr += 2;
  }
  else
  {
   memcpy(p_desStr, p_srcStr, 1);
   p_srcStr += 1;   
   p_desStr += 1;
  }
}
return 0;
}
其中Unicode这个数组就是利用最上面的程序生成的。

下面是directfb显示的例子。是在Linux下运行的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <directfb.h>
#include <assert.h>
static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static IDirectFBFont *pFont = NULL;
static int screen_width  = 0;
static int screen_height = 0;

#define DFBCHECK(x...)                                         \
{                                                          \
    DFBResult err = x;                                         \
                                                               \
    if (err != DFB_OK)                                         \
    {                                                          \
        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
        DirectFBErrorFatal( #x, err );                         \
    }                                                          \
}
int main (int argc, char **argv)
{
DFBSurfaceDescription dsc;
DFBFontDescription font_dsc;
char *TmpString = NULL;
DFBCHECK (DirectFBInit (&argc, &argv));
DFBCHECK (DirectFBCreate (&dfb));
DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));

dsc.flags = DSDESC_CAPS;
dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;

DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));
DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height));

DFBCHECK (primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff));
//DFBCHECK (primary->FillRectangle (primary,
//                        0, screen_height / 2,
//         screen_width - 1, screen_height / 6));
font_dsc.flags = DFDESC_ATTRIBUTES|DFDESC_HEIGHT|DFDESC_WIDTH;
font_dsc.width = 32;
font_dsc.height = 32;
DFBCHECK (dfb->CreateFont (dfb, \
         "/work/font.TTF", \
         &font_dsc, \
         &pFont));
primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff);
primary->SetFont (primary, pFont);
char SrcString[] = "协助李严镇守白帝,《三国志》称“征南\n(赵云)厚重";
TmpString = (char *)calloc(1, strlen(SrcString)*2);
GB2UTF_8(TmpString, SrcString);
DFBCHECK(primary->DrawString (primary,
                           TmpString, -1,
                           100, screen_height / 2, DSTF_LEFT));
free(TmpString);
DFBCHECK (primary->Flip (primary, NULL, 0));
//pFont->Release (pFont);
sleep (3);
primary->Release( primary );
dfb->Release( dfb );

return 23;
}
生成表和转的代码是在网上找来的,做了一点修改,directfb例子是在官网例子上做的修改。

回复 百度 目前传统的省域经济和行政区经济逐步向城市群经济过渡,城市的集聚效应日益凸显。

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表
百度