目录

1. 问题由来

2. UTF-8 BOM (byte order mark)

3. 简单的实验

4. What is FEFF?

5. 解决方法

5.1 方法一

5.2 方法二

5.3 方法三:dos2unix


1. 问题由来

在Linux中用GCC C++ Compiler(g++)编译报告以下错误:

error: stray ‘\357’ in program
error: stray ‘\357’ in program
error: stray ‘\274’ in program
error: stray ‘\233’ in program

查了查有些博客中有诸如此类的说法:“出现此类错误的原因,在编辑器中使用的utf-8的格式保存源代码中出现了中文的标点符号”、“在程序中打入了全角字符,也就是不是英文输入法”。

这些可能是会导致以上错误的原因的一种,但是并不适用于我现在碰到的这种情况。

以下总结一下关于这个问题的调查结果以及出现这种问题的简单的解决办法。

2. UTF-8 BOM (byte order mark)

\357、\273等等是属于所谓的”UTF-8 byte order mark“。

那UTF-8 BOM是什么东东呢?参考以下链接:

What Does UTF-8 With BOM Mean? - DZone Java

But in Notepad++, it appears to support UTF-8 wihtout BOM, but it won't recoginze it when first open. You can check this by going Menu > Encoding and see which one is selected. Notepad++ seems to only recognize UTF-8 wihtout BOM with ones it converted by it's own conversion utility. Perhaps it's a bug in notepad++.

So what is BOM? The byte order mark is useless for UTF-8. They only used for UTF-16 so they know which byte order is first. But UTF-8 will allow you to save these BOM for conversion purpose... they are ineffective in encoding the doc itself. So a "normal" UTF-8, it won't have BOM, but Windows would like to use them anyway. The Windows NOTEPAD would automatically save BOM in UTF-8!

So be-aware when viewing UTF-8 without BOM encoding files in Notepad++, as it can be deceiving at first glance.

简而言之,UTF-8并不需要BOM,BOM是在UTF-16中用于指示字节顺序的。在Linux编辑的文件会使用UTF-8 instead of UTF-8 BOM。但是,如果你不小心在Windows下用Notepad++打开了文件,它可能会自动地替你转成UTF-8 BOM,然后你把它保存了以后就把BOM字符带进文件了。

要命的是,这些BOM字符是不可见的(至少在Windows Notepad++编辑器中)。

3. 简单的实验

先在Linux下创建一个文件如下:

在Windows下用Notepad++打开,缺省地并没有如以上博客所说会设定成UTF-8 BOM:

可能还需要什么别的误(骚) 操作才会把格式变为UTF-8 BOM。这里手动的切换为UTF-8 BOM,然后保存。在Notepad++编辑器中并没有看出有什么异样(如上所述,BOM字符是不可见的)。

然后回到Linux下用Gvim打开文件:

OMG!妖孽现形了,第一行行首多出了个“<feff>”!

回头看最初发现这个编译问题时报错的那个文件打开一看,果然也是有这个东西,如下所示:

4. What is FEFF?

那究竟什么是FEFF呢?

参见:Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF) (fileformat.info)

         简而言之,它就是BOM,只不过是不同的叫法而已。

5. 解决方法

5.1 方法一

既然知道了罪魁祸首,直接在gvim编辑中将“<feff>”删掉即可。亲测有效。在以上出错文件中删掉这个后再编译就不再报告这个错误了。

5.2 方法二

在Windows Notepadd++中打开后确认选择“适用UFT-8 编码”后再保存,这样也可以消除那额外BOM字符。

5.3 方法三:dos2unix

一般来说,像跨windows/linux格式问题可以在linux中用dos2unix命令对文件进行格式转换即可。这样的话,可以批量地消除各种跨windows/linux格式问题。

但是,坏消息是(亲测结果):dos2unix转换对于这个BOM字符问题无效。。。

Reference:

What does: 'error: stray ‘\357’ in program' mean? (cprogramming.com)

What Does UTF-8 With BOM Mean? - DZone Java

windows 10 - UTF-8 vs UTF-8 with BOM - Super User

Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF) (fileformat.info)

C/C++: “error: stray ‘\357’ in program“问题及其解决方法相关推荐

  1. 当遇到error: stray ‘\241‘ in program错误的解决方法

    当遇到error: stray '\241' in program错误的解决方法 报错的意思是c/c++中的产生了编译错误. 该错误是指源程序中有非法字符,需要将非法字符去掉.一般是由于coder使用 ...

  2. [转]c编译错误--error:stray \357 in program及其引发的字符编码概述

    转自:https://blog.csdn.net/wolf_break/article/details/37904237 在编译c文件的时候,出现如下错误: error: stray '\357' i ...

  3. 遇到error: stray ‘\357’ in program [solution.c]的解决办法

    该错误是指源程序中有非法字符,需要将非法字符去掉.一般是由于coder使用中文输入法或者从别的地方直接复制粘贴代码造成的. 代码中出现了中文空格,中文引号, 各种中文标点符号都会出现,简单修改一下就O ...

  4. error: stray ‘\302’ in program 原因与解决办法

    出现此错误提示让我很困惑,一般这种错误提示会出现在从其他地方拷贝代码的过程中,是指源程序中含有非法字符,需要将非法字符去掉.一般是由于coder使用中文输入法或者从别的地方直接复制粘贴代码造成的.代码 ...

  5. stray '\241' in program错误的解决方法

    我遇到的错误原因是:代码中的tab应该用的是别的版式的tab,编译运行之后会出现这个错误,所以的tab的地方都报错了,但是看着又什么错误都没有. 解决方法: 复制报错位置附近的tab,然后查找替换所有 ...

  6. fatal error:Killed signal terminated program cc1plus错误解决方法

    解决办法:虚拟机分配的内存小了,扩大分配的内存

  7. error: stray '\343' in program 问题解决

          当我们从网上copy一段代码后,总会出现这个问题.博主在Arduino环境中也出现了,so,这个问题应该是C语言和C++编译器中才会出现的. test_int:19: error: str ...

  8. Dev-C++当遇到 [error] stray ‘\241‘ in program ... 时发生错误的解决方法

    当遇到 [error] stray '\241' in program - 时发生错误的解决方法 为什么会报错? 报错的意思是中文字符不识别导致产生了编译错误. 该错误是指源程序中有非法字符,需要将非 ...

  9. 程序编译错误error: stray ‘\200’ in program;error: stray ‘\343’ in program\CodeToCompile

    程序编译错误error: stray '\200' in program:error: stray '\343' in program 问题分析 实验 原理 问题分析 CodeToCompile 当你 ...

最新文章

  1. java中final的意义
  2. Python机器学习 使用sklearn构建决策树复习
  3. java两年需要,Java 两年总结
  4. RK3288开发过程中遇到的问题点和解决方法之Packages
  5. Ztree 仿淘宝树结构完美实现 移动 右键增删改
  6. 海量数据挖掘MMDS week4: 推荐系统之数据降维Dimensionality Reduction
  7. 白盒测试用例设计方法
  8. python爬取wifi密码完整代码_WIFIpass – Python获取本机保存的所有WIFI密码(附源代码)...
  9. java斗地主发牌教学,QQ游戏“斗地主”规则说明
  10. (转)解析智能推荐系统开发中十大关键要素
  11. PAT1150 Travelling Salesman Problem
  12. Power BI中计算同比、环比
  13. 9月20日.周日 第一场正式的比赛:2020年CCPC网络赛
  14. 一文彻底看懂LightGBM
  15. OpenHarmony 3.1Release 电话功能演示—基于润和DAYU200开发套件
  16. AWD攻防技巧(水文)
  17. 【超标量】分支预测的方向预测总结
  18. 快消行业营销难?巨量引擎让生意每一步明明白白
  19. 有限长信号自相关函数的估计
  20. 反掩码和通配符,傻傻分不清

热门文章

  1. I5 4590 台式机安装黑苹果再次入坑记(2019.12.23)
  2. 欧拉函数——数学知识(c++)
  3. 蓝桥杯.第几个幸运数字(数学_因子)
  4. 【大数据存储技术】第7章 MongoDB 的原理和使用
  5. 利用最小堆完成有理数的类定义以及有理数逻辑运算
  6. 2020数学建模美赛C题完整解答(结合代码)
  7. 深入理解.sync修饰符
  8. 电路邱关源学习笔记——1.1电路模型
  9. HTML5获取地理位置
  10. JStorm使用总结