硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4009|回复: 4
收起左侧

[emWin] 分享如何在EMWIN不改变C文件编码显示中文的方法

[复制链接]

8

主题

42

回帖

71

积分

初级会员

积分
71
发表于 2017-4-1 21:18:38 | 显示全部楼层 |阅读模式
这里我主要向大家分享一下如何在EMWIN中使用中文的技巧,该方法有利也有弊。
本文分别在EMWIN5.36下的VS2010和STM32F103(MDK)环境中测试通过的,其他开发环境请自行测试
看本文章之前,最好已阅读《安富莱_STM32-V6开发板emWin教程(V2.0)》教程中关于如何用Unicode编码显示汉字的章节(主要是22章)。
本文不再详细介绍如何生成字库等技巧,主要讲解教程中没提到的技巧,
我也是新手,如果有想法,可以相互交流。
好了,进入正文。如果仔细阅读教程22章,会发现教程中关于汉字的显示方式需要将包含汉字的C文件全部转化为UTF-8编码方式,
这就使得编写程序的时候,如果有多个C文件用到汉字,必须对每一个C文件转化为UTF8格式,不仅繁琐,
而且一旦程序中需要用到文件系统时,需要用到GBK等Windows下的编码时,处理起来反而更加麻烦。

那么问题来了,有没有什么办法在不改变C文件编码的方式的情况下显示中文?
答案当然是YES,那么如何操作呢?
下面有2种方式
一、使用GUI_DispString_UC()函数
该方法的局限性在于无法在控件中使用(可能有,但我没找到),若要在控件中使用需使用第二种方法。
  1. void MainTask(void)
  2. {
  3.     GUI_Init();
  4.     GUI_SetFont(&GUI_Fontsongti16);//字体请自行生成
  5.     GUI_GotoXY(16, 16);//由于GUI_DispString_UC无法设置显示位置,通过该函数可以指定
  6.     GUI_SetColor(GUI_BLUE);//设置指定的颜色,避免和背景色一致以免找不出原因
  7.     GUI_DispString_UC(L"你好");
  8.     while(1)
  9.     {
  10.         GUI_Exec();
  11.     }
  12. }
复制代码
效果如图所示 无标题.png
二、使用GUI_UC_ConvertUC2UTF8转化
  1. void MainTask(void)
  2. {
  3.     uint8_t buf[25] = "";//缓冲区的大小必须保证容纳足够的UTF8编码,一般[color=#ff0000]1个汉字最多需要6个字节的UTF8编码而且一定要初始化为全0,否则后面会跟乱码[/color]
  4.     GUI_Init();
  5.     GUI_UC_SetEncodeUTF8();
  6.     GUI_SetFont(&GUI_Fontsongti16);//字体请自行生成,在控件上显示中文,必须对每一个控件调用相应的设置字体的函数,如文本标签控件使用<WIDGET>_SetFont函数,具体查看手册
  7.     GUI_UC_ConvertUC2UTF8(L"测试显示", 4, buf, sizeof(buf));
  8.     GUI_SetColor(GUI_BLUE);//设置指定的颜色,避免和背景色一致以免找不出原因,若在控件中需要使用<WIDGET>SetTextColor()函数
  9.     GUI_DispStringAt(buf, 16, 16);
  10.     while(1)
  11.     {
  12.         GUI_Exec();
  13.     }
  14. }
复制代码
以上两种方法虽然不需要对C文件转化编码,但是方法一使用过于局限,方法二需要增加代码量,所以有利有弊,请自行权衡利弊
本质上是利用C语言L前缀表示强制将字符串转化为UNICODE编码格式(unsigned short格式),然后利用UNICODE转UTF8函数将字符串转化为UTF8格式
最后在设备上显示出来,本质原理和C文件转码无区别

评分

参与人数 1 +5 收起 理由
eric2013 + 5

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2017-4-2 00:25:51 | 显示全部楼层
非常感谢楼主分享。分享精神可贵,置酷[s:151]
回复

使用道具 举报

8

主题

42

回帖

71

积分

初级会员

积分
71
 楼主| 发表于 2017-4-2 08:17:22 | 显示全部楼层
补充一下,如果GUI_UC_ConvertUC2UTF8第二个字符长度参数比原先多一个字节的话,会把'\\0'也算进去,这样不初始化缓冲区也不会乱码了,不过建议养成参数初始化的好习惯
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2017-9-4 13:09:11 | 显示全部楼层
谢谢,对我真的很有用。
回复

使用道具 举报

9

主题

68

回帖

95

积分

初级会员

积分
95
发表于 2017-9-8 17:02:44 | 显示全部楼层
[s:151] 谢谢分享
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 02:13 , Processed in 0.267377 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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