找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教,这个汉字索引错怎样纠正?谢谢

[复制链接]
跳转到指定楼层
楼主
如下 :



原源文件是51系统的。
环境:proteus V8.9 , XC8 V1.31
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-11-12 23:40 | 只看该作者
把这个 “时”以及后面的逗号一起删掉就好了吧……

你字库是 16x16 看你一个字 刚好32个字节, 所以,这个“时” 是不应该出现在字库里才对的。
回复

使用道具 举报

板凳
ID:967119 发表于 2021-11-13 09:25 | 只看该作者
188610329 发表于 2021-11-12 23:40
把这个 “时”以及后面的逗号一起删掉就好了吧……

你字库是 16x16 看你一个字 刚好32个字节, 所以,这 ...

“时", 但这个是作索引用的,后面显示时要用它查找对应的汉字点阵。不能删。






回复

使用道具 举报

地板
ID:967119 发表于 2021-11-13 10:36 | 只看该作者
本帖最后由 cczjw 于 2021-11-13 11:10 编辑
cczjw 发表于 2021-11-13 09:25
“时", 但这个是作索引用的,后面显示时要用它查找对应的汉字点阵。不能删。

我猜测,那个索引 hzk_2[2] 就是给这个 ”时“ 汉字用的,占2个字节如下图示。要将这个”时“转化为两个字节靠 编译器完成。而我这C语言编译器 XC8不支持? 不知我猜测对不对。请指教!



回复

使用道具 举报

5#
ID:401564 发表于 2021-11-13 13:06 | 只看该作者
有可能这种写法只能在51的环境下运行,如果换了单片机,你可能试一下GB2312码来代替,
比如"时"是:0x42,0x17     (4217)是"时"的代码
不管是SH1106还是SSD1306,网上都有资料,不要去直接复制别人的代码,用个两三天的时间,自己就可以写了
回复

使用道具 举报

6#
ID:624769 发表于 2021-11-13 13:14 | 只看该作者
如果,把这个汉字换成两个独立的16进制就不报错的话……, 你可以尝试按地板的说法,换成0x42,0x79,
然后,define 一下“时” 为 0x4279   ?
回复

使用道具 举报

7#
ID:967119 发表于 2021-11-13 20:38 | 只看该作者
本帖最后由 cczjw 于 2021-11-13 20:46 编辑

5、6楼说得对,将 “时” 换成拆解后的 0x42,0x17 就不报这个错了。说明似乎是 编译器 XC8 不能译码 ”时“ 为2个16进制数 0x42,0x16 ,或者 时 字前后的分隔符(”)在 XC8 应该用其它的?(我试过(‘)也不行)
它现在报的错是非法字符,问题应该还是出在 “时” 这个汉字前后的双引号上。



有懂的大侠指教一、二?谢谢!
回复

使用道具 举报

8#
ID:967119 发表于 2021-11-13 20:52 | 只看该作者
188610329 发表于 2021-11-13 13:14
如果,把这个汉字换成两个独立的16进制就不报错的话……, 你可以尝试按地板的说法,换成0x42,0x79,
然后, ...

你说的这样确实能够应急,但我想找到根本原因,便于以后正常使用。
回复

使用道具 举报

9#
ID:967119 发表于 2021-11-13 21:22 | 只看该作者
5、6楼说的不错。我用内码 0x42,0x17 换下 “时” 后就不报这个错了。似乎是编译器 XC8 在这里不把 “时" 解析为内码 0x42,0x17,所以这语句不能通过。因报的是 非法字符 错(下图示),所以也许 XC8 不认 "时” 中的双引号 “ 而认的是其它分隔符?我试了用单引号 ’ 也是报同样的错。



有哪位大侠明白?指点一、二?谢谢!
回复

使用道具 举报

10#
ID:967119 发表于 2021-11-14 11:32 | 只看该作者
下图是 C编译器XC8 出错信息指导。难道不能出现汉字?


回复

使用道具 举报

11#
ID:624769 发表于 2021-11-14 13:22 | 只看该作者
一般,严谨的编译器是不会允许使用汉字的,毕竟没有表头指定的话,同样一个汉字GB2312,UTF8, GB18003, 都是不一样的内码,编译器压根不知道应该按哪个字典来给你译, 编译器表示,这个锅,不背。
回复

使用道具 举报

12#
ID:967119 发表于 2021-11-14 13:25 | 只看该作者
188610329 发表于 2021-11-14 13:22
一般,严谨的编译器是不会允许使用汉字的,毕竟没有表头指定的话,同样一个汉字GB2312,UTF8, GB18003, 都是 ...

那,这个问题该怎样解决呢?
回复

使用道具 举报

13#
ID:624769 发表于 2021-11-14 14:01 | 只看该作者
cczjw 发表于 2021-11-14 13:25
那,这个问题该怎样解决呢?

1) 你迁就编译器, 他说不许,你就不用。(就像前面说的直接用16进制,然后define呗)
2) 编译器迁就你,他不许,你就换别的编译器,直到这个编译器端正态度,给你用为止,你再考虑用回这个编译器。

讲道底, 商业角度讲,这叫买方市场,还是卖方市场。
情感角度,这叫男追女,还是女追男。
要么有一方让步,要么一拍两散,没必要强拧,瓜不甜。
回复

使用道具 举报

14#
ID:373388 发表于 2021-11-14 14:04 | 只看该作者
你用的是什么开发平台呢,是不是MICROCHIP 的MPLAB X IDE,  MPLAB X IDE 菜单tool->option->Embedded->Generic settings->Default Charset   选择 GB2312  应该可以解决这个问题;还有struct hzk{uchar hzk_2[2],........};修改为struct hzk{uint kzk_1,......};
回复

使用道具 举报

15#
ID:373388 发表于 2021-11-14 14:05 | 只看该作者
汉字编码占用两个字节,定义为uint
回复

使用道具 举报

16#
ID:401564 发表于 2021-11-14 14:26 | 只看该作者
cczjw 发表于 2021-11-14 13:25
那,这个问题该怎样解决呢?

看一下数据手册,有没有其它办法,没有的话,就只能输入代码了
GB2312是汉字字库,说白了就是中国
芯片厂商重视中国市场,就搞个兼容,不重视,你爱咋咋的,PIC也就这几年开始重视中国市场,很多芯片都开始有中文的PDF,当初的PIC16F877A这个经典型号可是没有中文PDF的......

回复

使用道具 举报

17#
ID:967119 发表于 2021-11-14 17:03 | 只看该作者
188610329 发表于 2021-11-14 14:01
1) 你迁就编译器, 他说不许,你就不用。(就像前面说的直接用16进制,然后define呗)
2) 编译器迁就 ...

如果真是这样当然要么不用它要么适应它,问题是我现在需确定XC8是否肯定在这种索引操作中不能用 汉字 作索引?还是我语句语法没用对?
回复

使用道具 举报

18#
ID:967119 发表于 2021-11-14 17:06 | 只看该作者
xhaity 发表于 2021-11-14 14:05
汉字编码占用两个字节,定义为uint

我试了,改为 uint 也不行。
回复

使用道具 举报

19#
ID:624769 发表于 2021-11-14 22:31 | 只看该作者
cczjw 发表于 2021-11-14 17:03
如果真是这样当然要么不用它要么适应它,问题是我现在需确定XC8是否肯定在这种索引操作中不能用 汉字 作 ...

不知道该怎么跟你讲……

这么说吧,如果,你把 时  换成 '0' 的话,编译应该是能通过的。 他会把它翻译成 0x30,做为这个数组的一部分。
那么,如果,他支持汉字,比如内建了 GB2312 字库, 那么,编译的时候,就会把 “时” 翻译成 0x4712 作为这个数组的一部分,而实际上,一般不会这么做,理由很复杂,三两句说不清,主要原因就是字库太多,不管怎么翻都可能会出现错误。编译的时候按GB2312 编译了, 调用的时候用的 UTF8 去找,同样一个 “时”  数组里面确死活找不到。
严归正传,即便支持GB2312  把 “时” 翻译成 0x4712 实际上最后存在 数组当中的, 还是 0x4712, 所以,你对这个  “时”  能不能通过编译,为什么那么执著呢? 而且,会有另一个问题,   “时”  = 0x4712 是一个16位数据,你数组是 8 位的, 这么混合放入数组, 又会出现新的错误。 除非,你把后面那些 全都两两结合,变成16位数据,数组改成16位的。那么,通过概率还能大点。反正,换了我,宁可用‘S’ 'H'  来索引 也不愿用 “时” 来索引,即便编译器支持。 因为不知道会帮我编译成什么。
回复

使用道具 举报

20#
ID:967119 发表于 2021-11-14 22:56 | 只看该作者
188610329 发表于 2021-11-14 22:31
不知道该怎么跟你讲……

这么说吧,如果,你把 时  换成 '0' 的话,编译应该是能通过的。 他会把它翻 ...

大概明白你的意思。主要是这是别人做的例程,应该是在他的系统中能够通过。关键是这种写汉字的方法非常方便,一句 “OLED_ShowCHinese(12*8,0,"时",1); ”,把你要写的汉字放进去就行了它自己去查找不用我再去查编码。因此 XC8 能够支持更好,若不能,能够找到能支持的编译器也行。谢谢!
回复

使用道具 举报

21#
ID:967119 发表于 2021-11-14 22:58 | 只看该作者
xhaity 发表于 2021-11-14 14:04
你用的是什么开发平台呢,是不是MICROCHIP 的MPLAB X IDE,  MPLAB X IDE 菜单tool->option->Embedded->Gene ...

环境:proteus V8.9 , XC8 V1.31    谢谢!
回复

使用道具 举报

22#
ID:967119 发表于 2021-11-14 23:08 | 只看该作者
本帖最后由 cczjw 于 2021-11-14 23:26 编辑
xhaity 发表于 2021-11-14 14:04
你用的是什么开发平台呢,是不是MICROCHIP 的MPLAB X IDE,  MPLAB X IDE 菜单tool->option->Embedded->Gene ...

我将 struct hzk{uchar hzk_2[2],........}; 的 uchar 改为 uint 也不行。
回复

使用道具 举报

23#
ID:967119 发表于 2021-11-14 23:10 | 只看该作者
Y_G_G 发表于 2021-11-14 14:26
看一下数据手册,有没有其它办法,没有的话,就只能输入代码了
GB2312是汉字字库,说白了就是中国
芯片厂商 ...

我再试试其它编译器看是否编译器的问题。
回复

使用道具 举报

24#
ID:967119 发表于 2021-11-15 17:12 | 只看该作者
其实它翻译成么并不重要,只要它在这两个文件中对这个索引字( “时”.....) 都用相同的规则翻译(这个应该能保证)就能起到索引的作用。


回复

使用道具 举报

25#
ID:624769 发表于 2021-11-15 17:33 | 只看该作者
cczjw 发表于 2021-11-15 17:12
其实它翻译成么并不重要,只要它在这两个文件中对这个索引字( “时”.....) 都用相同的规则翻译(这个应该 ...

所以说,既然无所谓翻译成什么,
那么:
#define        "时"        0x4712
或者
#define        "时"        0x47,0x12

让编译过去,不好么?
回复

使用道具 举报

26#
ID:967119 发表于 2021-11-15 18:16 | 只看该作者
这个好像不能用#define,宏名( "时" )必须以字母开头样?而且如果这样,用到的每个汉字都得再查或编一个代码,这没达到省事的初衷。


回复

使用道具 举报

27#
ID:373388 发表于 2021-11-20 11:15 | 只看该作者
cczjw 发表于 2021-11-14 23:08
我将 struct hzk{uchar hzk_2[2],........}; 的 uchar 改为 uint 也不行。

我试了一下,uchar改为uint是可以的啊
struct hzk
{
    unsigned int hzk1;
    unsigned char hzk4[4];
};
struct hzk const hzkk[] = {"时" ,1,2,3,4,"好",5,6,7,8};
回复

使用道具 举报

28#
ID:967119 发表于 2021-11-28 13:38 | 只看该作者
xhaity 发表于 2021-11-20 11:15
我试了一下,uchar改为uint是可以的啊
struct hzk
{

哦,我试试呢。谢谢!
回复

使用道具 举报

29#
ID:967119 发表于 2021-11-28 13:45 | 只看该作者
xhaity 发表于 2021-11-20 11:15
我试了一下,uchar改为uint是可以的啊
struct hzk
{

我这还是报错。proteus V8.9   C编译器 XC8 V1.31


回复

使用道具 举报

30#
ID:401564 发表于 2021-11-28 14:06 | 只看该作者
cczjw 发表于 2021-11-28 13:45
我这还是报错。proteus V8.9   C编译器 XC8 V1.31

这都半个月了,还在纠结这个"汉字"?
有这时间,我早就自己写好一个属于自己的OLED代码了,自己去写代码,更能加深理解,也能从别人的代码中得到更好的经验
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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