硬汉嵌入式论坛

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

[emWin] 一直困扰着初学者学习emWin的汉字显示的那些事,实测MDK4.74,MDK5.21a和IAR7.5的UTF-8编码

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
发表于 2016-8-24 19:54:16 | 显示全部楼层 |阅读模式
说UTF-8编码是因为emWin要用到。使用emWin的小软件FontCvt转化出的字库是16bit Unicode编码的,显示的时候通过UTF-8显示。
==========================================
MDK4.74
     早期的做法一直都是将汉字显示所在的源文件使用记事本另存为UTF-8编码类型,特别注意,记事本另存的是UTF-8 带 BOM。
且用户修改了这个文件的任何地方,MDK都会自动将这个文件存储为UTF-8编码无BOM。实际用notepad++另存为UTF-8带BOM或者不带BOM,
使用MDK4.74都可以正确显示汉字的。
MDK5.21a
     对于MDK5.21a来说,也可以使用记事本将汉字显示所在的源文件使用记事本另存为UTF-8编码类型,此时编译MDK5.21a是可以正确编译的
但是,用户一旦修改了这个文件的任何地方,直接编译或者保存后编译,MDK都会将这个文件存储为UTF-8编码无BOM,而MDK5.21a无法像
MDK4.74那样带BOM或者不带BOM都能够识别,所以编译会出错,用户不得不再次用记事本另存。
    初步认为这个是MDK5的bug。
IAR7.5
    对于IAR7.5来说,他仅支持UTF-8无BOM,修改的时候不要使用记事本,直接在汉字显示所在的源文件右击选择即可,或者用notepad++选择
UTF-8无BOM
1.jpg

==================================================
再来说一下MDK4或者MDK5为什么会把UTF-8有BOM转换成UTF-8无BOM,原因就在这里,MDK4也好,MDK5也好
仅支持UTF-8无BOM编码,但是区别的是MDK5居然无法识别UTF-8无BOM的编码文件中的汉字,而MDK4没有此问题。
3.jpg



IAR7.5里面也有这个选项的:
4.jpg



如果用户选择了这个编码选项,在IAR或者MDK中创建新文件都会以UTF-8无BOM进行编码。
==========================================================
名词解释:BOM
      BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。
      UTF-8 不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 "Zero Width No-Break Space" 的 UTF-8 编码
是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记
文本文件的编码方式的。
      WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符
(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
===========================================================
总结:
1. IAR7.5仅支持UTF-8编码无BOM文件的汉字显示,带BOM的话,编译不通过。
2. MDK4.74对于UTF-8带BOM或者不带BOM都支持,但会将带BOM文件修改为不带BOM,两种编码形式显示汉字不受影响。
3. MDK5.21a对于UTF-8带BOM或者不带BOM都支持,同样会修改BOM文件修改为不带BOM,修改后文件带有汉字会编译不通过。
带BOM时,显示是不受影响的。所以用户每修改一次这个文件就得另存文件的编码类型为带BOM,个人认为这个是MDK5的bug。
回复

使用道具 举报

7

主题

70

回帖

91

积分

初级会员

积分
91
发表于 2016-10-10 23:03:40 | 显示全部楼层
学习中。。。。。。。。。。。。。。。
回复

使用道具 举报

2

主题

25

回帖

1

积分

新手上路

积分
1
发表于 2017-4-26 11:06:20 | 显示全部楼层
现在我已经用最新版5.23了,可是还是会有这个问题
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2017-4-27 10:39:07 | 显示全部楼层
MDK用的是开源的Scintilla做的编辑支持,现在都做不好这个功能。还不如给微软的visual studio做个插件,让我们用免费的visual studio express版本。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
QQ
发表于 2019-3-28 18:29:34 | 显示全部楼层
老大,还是不行呀。具体有什么方式可以修改一下吗??
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Flash'
compiling MainTask.c...
..\..\emWin\emWinTask\MainTask.c(197): error:  #8: missing closing quote
    { "璇峰彇娆?",
..\..\emWin\emWinTask\MainTask.c(220): error:  #8: missing closing quote
    { "璇峰彇娆?",
..\..\emWin\emWinTask\MainTask.c(228): error:  #8: missing closing quote
    { "鑷?姩鍙栨?鏈?",
..\..\emWin\emWinTask\MainTask.c(240): error:  #8: missing closing quote
    { "瀵嗙爜閿欒?锛佽嚦灏戞槸4浣?",
..\..\emWin\emWinTask\MainTask.c(244): error:  #8: missing closing quote
    { "璇疯緭鍏ラ噾棰?",
..\..\emWin\emWinTask\MainTask.c: 0 warnings, 5 errors
".\Flash\Obj\output.axf" - 5 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2019-3-29 10:29:15 | 显示全部楼层
mr_xie 发表于 2019-3-28 18:29
老大,还是不行呀。具体有什么方式可以修改一下吗??
*** Using Compiler 'V5.06 update 6 (build 750)', ...

QQ截图20190329102552.png

如图增加--locale=english这个配置试试
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2020-4-23 21:37:02 | 显示全部楼层
hanzixiangel 发表于 2019-3-29 10:29
如图增加--locale=english这个配置试试

没用123456789
回复

使用道具 举报

8

主题

42

回帖

71

积分

初级会员

积分
71
发表于 2020-4-28 10:31:29 | 显示全部楼层
也可以在Unicode编码下通过GUI_UC_ConvertUC2UTF8转化实现
回复

使用道具 举报

334

主题

2036

回帖

3043

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3043
发表于 2020-4-28 15:46:40 | 显示全部楼层
hanzixiangel 发表于 2019-3-29 10:29
如图增加--locale=english这个配置试试

这个是正解! 简单有效,所有mdk5系列都可以~!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
 楼主| 发表于 2020-4-29 10:19:47 | 显示全部楼层
zwmasdf 发表于 2020-4-28 10:31
也可以在Unicode编码下通过GUI_UC_ConvertUC2UTF8转化实现

这种方法也可以。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
 楼主| 发表于 2020-4-29 10:20:00 | 显示全部楼层
caicaptain2 发表于 2020-4-28 15:46
这个是正解! 简单有效,所有mdk5系列都可以~!

对,现在都采用这种的了。
回复

使用道具 举报

8

主题

39

回帖

63

积分

初级会员

积分
63
发表于 2022-5-23 17:41:04 | 显示全部楼层
很奇怪,我用的是MDK5.26  其他字都能显示,就是“EE溢出序号”会显示成“EE出序号”  “溢”字不显示,也通过notepad++转换格式了。。。。求指导
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
 楼主| 发表于 2022-5-24 02:04:06 | 显示全部楼层
sunshine666 发表于 2022-5-23 17:41
很奇怪,我用的是MDK5.26  其他字都能显示,就是“EE溢出序号”会显示成“EE出序号”  “溢”字不显示,也 ...

用的什么方式,小字库方式吗,还XBF, SIF这种。
回复

使用道具 举报

8

主题

39

回帖

63

积分

初级会员

积分
63
发表于 2022-5-24 08:25:17 | 显示全部楼层
eric2013 发表于 2022-5-24 02:04
用的什么方式,小字库方式吗,还XBF, SIF这种。

用的是“sif_font_lib_newsong_24.sif”
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
 楼主| 发表于 2022-5-25 02:16:01 | 显示全部楼层
sunshine666 发表于 2022-5-24 08:25
用的是“sif_font_lib_newsong_24.sif”

明天了我试试显示这几个字。
回复

使用道具 举报

8

主题

39

回帖

63

积分

初级会员

积分
63
发表于 2022-6-2 08:07:14 | 显示全部楼层
eric2013 发表于 2022-5-25 02:16
明天了我试试显示这几个字。

硬汉哥 ,你有没有帮忙测试一下呢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
 楼主| 发表于 2022-6-2 11:48:47 | 显示全部楼层
sunshine666 发表于 2022-6-2 08:07
硬汉哥 ,你有没有帮忙测试一下呢。

这就测试下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106907
QQ
 楼主| 发表于 2022-6-2 11:55:47 | 显示全部楼层
sunshine666 发表于 2022-6-2 08:07
硬汉哥 ,你有没有帮忙测试一下呢。

帮你测试了,没问题
使用此贴的例子:V7-535_emWin6.x实验_SIF格式全字库生成和使用方法(QSPI Flash 裸机)

image.png

回复

使用道具 举报

8

主题

39

回帖

63

积分

初级会员

积分
63
发表于 2022-6-2 12:14:41 | 显示全部楼层
eric2013 发表于 2022-6-2 11:55
帮你测试了,没问题
使用此贴的例子:V7-535_emWin6.x实验_SIF格式全字库生成和使用方法(QSPI Flash 裸 ...

感谢感谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 14:13 , Processed in 0.379054 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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