嵌入式实验第一次课后作业-1

原以为这节课作业会很简单,没想到把附加要求都算进去之后,两道题总共花了七八个小时时间才写掉(不过也有写第一题的时候状态不好的原因啦),于是我决定写(shui)篇博文

话不多说,先看题目

课后作业1:点阵汉字显示

附加要求1:输入限制扩展到16个字符,支持中英文混合显示
附加要求2:改用GBK点阵字库,支持'囧'等GBK汉字显示

一看题目,这多简单啊。由于课上练习做得快,直接课上就写起了代码,下课前就在windows上实现了基础功能,并给老师展示了一下。然而老师邪魅一笑:你用linux试试。

回到家,把代码上传到台机的linux环境下一运行,果然输出的全是乱码。开始找原因,发现是编码问题。windows下我是用atom敲的代码,编码格式选了gbk,而linux下是用的cb,代码格式不能选gbk。又查了一下Unicode下两个字节对应一个中文字符,而utf8下是三个对一个,那么只要在查询字库前加一步把三个字节转换成两个字节就万事大吉了

使用谷歌大法得知,应该用iconv函数来完成这个转换,以下引用另一篇博文的内容:

  • iconv函数族的头文件是iconv.h,使用前需包含之。
    #include <iconv.h>
    iconv函数族有三个函数,原型如下:
  • (1) iconv_t iconv_open(const char *tocode, const char *fromcode);
    此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
  • (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
    此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。
  • (3) int iconv_close(iconv_t cd);
    此函数用于关闭转换句柄,释放资源。
  • 此段引用自: 阿笨猫的窝

然后是显示部分,分为汉字和英文两部分

英文部分调用ASC16字库即可,编码相当简单:offset = q*16

中文部分,先写了HZK16字库版本,编码格式为:(94*(区码-1)+(位码-1))*32,两千多个汉字被分为94个区得来

然后是gbk版本,在网上找了很久的gbk字库都找不到,qq群内的那个gbk字库老师又说忘了编码格式,我试了几次规律也没试出来。过了一天,群内突然有大神给出了编码格式:offset = (区码* 191 + 位码)*32,试了下果然正确,于是改了下提交了作业

代码及三个字库下载链接

点赞
  1. GaoPai Li说道:
    Google Chrome Windows 10

    Fatal error: Uncaught ArgumentCountError: Too few arguments to function Walker_Comment::filter_comment_text(), 1 passed in /www/wwwroot/duya112233/wp-includes/class-wp-hook.php on line 287 and exactly 2 expected in /www/wwwroot/duya112233/wp-includes/class-walker-comment.php:267 Stack trace: #0 /www/wwwroot/duya112233/wp-includes/class-wp-hook.php(287): Walker_Comment->filter_comment_text('<p>\xE5\xA4\xAA\xE9\xA1\xB6\xE4\xBA\x86</p...') #1 /www/wwwroot/duya112233/wp-includes/plugin.php(206): WP_Hook->apply_filters('<p>\xE5\xA4\xAA\xE9\xA1\xB6\xE4\xBA\x86</p...', Array) #2 /www/wwwroot/duya112233/wp-content/themes/kratos-pjax-master/inc/ua.php(432): apply_filters('comment_text', '\xE5\xA4\xAA\xE9\xA1\xB6\xE4\xBA\x86') #3 /www/wwwroot/duya112233/wp-content/themes/kratos-pjax-master/inc/ua.php(436): user_agent_display_comment() #4 /www/wwwroot/duya112233/wp-includes/class-wp-hook.php(289): user_agent('\xE5\xA4\xAA\xE9\xA1\xB6\xE4\xBA\x86') #5 /www/wwwroot/duya112233/wp-includes/plugin.php(206): WP_Hook->apply_filters('\xE5\x in /www/wwwroot/duya112233/wp-includes/class-walker-comment.php on line 267