2279|0

2169

帖子

8

TA的资源

五彩晶圆(初级)

楼主
 

一个奇怪的问题引发的文件编码格式的“坑” [复制链接]

本帖最后由 wsmysyn 于 2018-3-25 12:09 编辑

RT
其实想起名“血案”来着,但是想想并没有那么严重也就算了

背景:
最近的一个项目需要在某ATE平台上开发测试程序(C/C++纯code方式),基于厂商提供的底层库和开放的API完成project的搭建
想法是想搭建起最小工程,然后只要通过make工具编译成功就好,起码证明最小工程没问题
基于对方提供的一个example工程修改(这也为后面引发的奇怪的问题做好了铺垫

问题:
由于很多头文件不需要或者不相干的测试项,保留最精简的核心函数(图1);(工程中其他文件必要文件已经搞定了)
编译一下吧,额??怎么突然提示失败呢(图2)?明明修改之前是没有问题的。。。
然后就是ctrl + z,再编译,Ctrl + z,再编译。。。
突然发现include了一个根本不需要的头文件后居然ok了,好神奇
看了一下那个不需要的头文件和pln文件的程序内容应该不是必要的才对啊?
然后为了验证这个问题,就include了一个空文件,就是图上那个test.h,这个文件是空白的,什么都没有
编译一下,OK(图3)
那么注释掉这行,编译一下,又fail

问题的触发条件清楚了,只需要包含一下文件头就ok,无论是什么,不包含就错误
这个问题一开始就没有想找厂商来解决,只是想既然是C++,纯code的,总归还是可以解决的,先认为他们没问题,然后找自己的问题
(PS:有一些ATE设备是UI界面的,按照流程图方式只需要拖拽窗口,填一下参数就可以测试,问题还不大,如果有问题,估计就是比较麻烦的问题,自己不好解决)

分析过程:
根据编译错误提示 工程名_body.cpp 文件的553行有语法错误
这个cpp文件是IDE 预处理器宏展开 + 自动代码工具自动生成的cpp源文件,直接修改这个cpp文件是没有用的,因为下一次编译还是要覆盖掉的
那就找到这个文件看了一下第553行(图4)
怎么还冒出中文了???WTF??
应该是乱码了吧。。然后查看了一下cpp的文件编码格式-->ANSI;那就调成UTF8吧(图5)这回变成16进制块了
码是什么意思呢?暂时不知道

然后就在想为什么正常量产使用的软件,到我这就这么明显的bug呢?应该还是我的问题吧。。。
输出是乱码,那么输入的文件是不是也有一些其他怪异的字符呢?
看了一下整个pln文件内容,并没有发现奇怪的字符,那么是否有其他的隐藏字符?
也查看一下输入的pln文件的编码格式,嗯,UTF8-BOM(什么鬼)
直觉问题应该是这个了,修改为UTF-8(之后也修改成ANSI格式试验)
再次编译,终于是希望看到的编译结果——OK了

解决办法:
问题很清楚了,就是编码格式的问题
将输入的文件编码格式修改为ANSI或者UTF-8
(至于踩到这个坑,也是醉了)

后续:
之前在notepad++上也看到过这一些编码,只不过没有深入研究,习惯性的设置为utf-8
百度google了一下关于UTF8和UTF8-BOM的区别:
哦,原来如此。。。

那么这算不算这个IDE的一个bug呢

一个带标签,一个没有标签。
BOM是Byte Order Mark(定义字节顺序),因为在网络传输中分两种顺序:大头和小头。

由于兼容性,带BOM的utf-8在一些browser中显示为乱码。

网上搜索了关于Byte Order Mark的信息:
在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建
议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

带BOM的UTF-8,所有PHP无法识别,直接将EF BB BF输出,在charset="utf-8"的页面中是空白,在GB2312的页面中的输出的就是稀有汉字:锘匡豢



题外话:


不知道大家以前是不是也有过相似的经历呢

(图1)


(图2)

(图3)

(图4)

(图5)

点赞 关注
个人签名坐而言不如起而行
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表