找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 2922 | 评论数: 29 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-11-12 22:22

正文摘要:

如下 : 原源文件是51系统的。 环境:proteus V8.9 , XC8 V1.31

回复

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

这都半个月了,还在纠结这个"汉字"?
有这时间,我早就自己写好一个属于自己的OLED代码了,自己去写代码,更能加深理解,也能从别人的代码中得到更好的经验
ID:967119 发表于 2021-11-28 13:38
xhaity 发表于 2021-11-20 11:15
我试了一下,uchar改为uint是可以的啊
struct hzk
{

哦,我试试呢。谢谢!
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};
ID:624769 发表于 2021-11-15 17:33
cczjw 发表于 2021-11-15 17:12
其实它翻译成么并不重要,只要它在这两个文件中对这个索引字( “时”.....) 都用相同的规则翻译(这个应该 ...

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

让编译过去,不好么?
ID:967119 发表于 2021-11-14 23:10
Y_G_G 发表于 2021-11-14 14:26
看一下数据手册,有没有其它办法,没有的话,就只能输入代码了
GB2312是汉字字库,说白了就是中国
芯片厂商 ...

我再试试其它编译器看是否编译器的问题。
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 也不行。
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    谢谢!
ID:967119 发表于 2021-11-14 22:56
188610329 发表于 2021-11-14 22:31
不知道该怎么跟你讲……

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

大概明白你的意思。主要是这是别人做的例程,应该是在他的系统中能够通过。关键是这种写汉字的方法非常方便,一句 “OLED_ShowCHinese(12*8,0,"时",1); ”,把你要写的汉字放进去就行了它自己去查找不用我再去查编码。因此 XC8 能够支持更好,若不能,能够找到能支持的编译器也行。谢谢!
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'  来索引 也不愿用 “时” 来索引,即便编译器支持。 因为不知道会帮我编译成什么。
ID:967119 发表于 2021-11-14 17:06
xhaity 发表于 2021-11-14 14:05
汉字编码占用两个字节,定义为uint

我试了,改为 uint 也不行。
ID:967119 发表于 2021-11-14 17:03
188610329 发表于 2021-11-14 14:01
1) 你迁就编译器, 他说不许,你就不用。(就像前面说的直接用16进制,然后define呗)
2) 编译器迁就 ...

如果真是这样当然要么不用它要么适应它,问题是我现在需确定XC8是否肯定在这种索引操作中不能用 汉字 作索引?还是我语句语法没用对?
ID:401564 发表于 2021-11-14 14:26
cczjw 发表于 2021-11-14 13:25
那,这个问题该怎样解决呢?

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

ID:373388 发表于 2021-11-14 14:05
汉字编码占用两个字节,定义为uint
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,......};
ID:624769 发表于 2021-11-14 14:01
cczjw 发表于 2021-11-14 13:25
那,这个问题该怎样解决呢?

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

讲道底, 商业角度讲,这叫买方市场,还是卖方市场。
情感角度,这叫男追女,还是女追男。
要么有一方让步,要么一拍两散,没必要强拧,瓜不甜。
ID:967119 发表于 2021-11-14 13:25
188610329 发表于 2021-11-14 13:22
一般,严谨的编译器是不会允许使用汉字的,毕竟没有表头指定的话,同样一个汉字GB2312,UTF8, GB18003, 都是 ...

那,这个问题该怎样解决呢?
ID:624769 发表于 2021-11-14 13:22
一般,严谨的编译器是不会允许使用汉字的,毕竟没有表头指定的话,同样一个汉字GB2312,UTF8, GB18003, 都是不一样的内码,编译器压根不知道应该按哪个字典来给你译, 编译器表示,这个锅,不背。
ID:967119 发表于 2021-11-13 20:52
188610329 发表于 2021-11-13 13:14
如果,把这个汉字换成两个独立的16进制就不报错的话……, 你可以尝试按地板的说法,换成0x42,0x79,
然后, ...

你说的这样确实能够应急,但我想找到根本原因,便于以后正常使用。
ID:624769 发表于 2021-11-13 13:14
如果,把这个汉字换成两个独立的16进制就不报错的话……, 你可以尝试按地板的说法,换成0x42,0x79,
然后,define 一下“时” 为 0x4279   ?
ID:401564 发表于 2021-11-13 13:06
有可能这种写法只能在51的环境下运行,如果换了单片机,你可能试一下GB2312码来代替,
比如"时"是:0x42,0x17     (4217)是"时"的代码
不管是SH1106还是SSD1306,网上都有资料,不要去直接复制别人的代码,用个两三天的时间,自己就可以写了
ID:624769 发表于 2021-11-12 23:40
把这个 “时”以及后面的逗号一起删掉就好了吧……

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

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

Powered by 单片机教程网

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