KEIL中代码里包含汉字报错: warning: #870-D
KEIL中代码里包含汉字报错: warning: #870-D
本文解释一下870-D告警的来源及如何处理。
1.如何让keil支持中文?
keil的菜单栏edit->configuration配置里面就可以选择编码格式,里面有ANSI,UTF-8,GB2312等格式,一般常用的就这提到的三种,都是支持中文的编码格式。
2.为什么别的代码拷贝过来是乱码?
那是因为别人的代码在编写保存的时候使用的编码格式和你当前keil的编码格式不一致,比如他用GB2312写的代码,你拷贝到你这里是UTF-8,如果不转换,直接贴过来或者直接打开他的文件,就会乱码。
可以做如下测试:先设置KEIL为GB2312编码格式,然后敲一段代码,注释用中文,或者用printf函数,打印中文字符串。保存,再切换到UTF-8,就会变成乱码。
/**
* @brief 中文乱码测试
*/
#include "stdio.h"
int main(void){
printf("我测试下乱码!\r\n"); //测试中文乱码
return 0;
}
3.如何解决别人的代码乱码问题?
用工具,可以在CSDN资源搜【GB-UTF8编码格式-批量转换工具】,把源码文件夹拖进去,格式筛选先输入.h转换,再输入.c转换。好像不支持同时两种格式。转换完成后再用keil打开,同时把keil编码格式设置为目标格式就行了。一般来说大部分都是从GB转为UTF-8。
4.为什么转完了编译要报warning:#870-D?
那是因为全角字符和半角字符混用导致的,另外就是keil原生对包含中文的代码支持就不好,有一些把汉字内容删掉后重新输入一遍就不报了,有一些要删掉中英文混用的英文字母或数字或半角符号就可以,同样的代码,同一个keil环境,前后编译输出结果可能不同(有时候报有时候不报),说明keil本身功能有一定的BUG。比如下面这个代码:
printf("汉字测试123English\r\n");
如果是文件直接转过来的,一开始报870,删掉123,可能就不报了。加上123又报,然后把整个全部删掉重新挨个输入一次,就对了。
我自己测试的结果大致是这样(不是绝对靠谱,有些字符不一定适用):汉字后面跟全角半角英文数字都行,但全角字符后面不能跟数字和半角字符。
printf("汉字。");//可以
printf("汉字123.");//可以
printf("汉字.123");//可以
printf("汉字。ABC123");//可以
printf("汉字。123");//不行,句号是全角字符,后面不能跟数字
printf("汉字。!123");//不行,但是把英文感叹号换成@是可以的,不知道为什么!!!!
有兴趣的可以自己测试下。
【更新】汉字包括全角字符总数必须为偶数!这个应该是真的,KEIL有可能在对齐上有要求。
5.如何让keil不报warning#870-D?
源文件里加#pragma diag_suppress 870。让keil屏蔽掉这个类型的warning输出。
包含汉字的源码不多的情况下建议挨个去排查一遍,重整代码,多的话就直接屏蔽拉倒。