编译工程时报java:[1,0] illegal character: \65279问题排查与解决过程

最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退,故SCM将该xxx.java文件用editplus打开删除了新添的一行,删除后重新编译打包,却报了如下异常:

java:[1,0] illegal character: \65279
表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了该xxx.java类的属性,才发现玄机所在:
编译有问题的文件属性:(注意最下面一行 Byte Order Mark is UTF-8  (BOM))

编译正常的文件属性:

看来问题出在 Byte Order Mark is UTF-8  (BOM)上。因为看不出来问题,所以用UltraEdit打开两个文件,并用16进制格式显示:

有问题的文件头:

无问题的文件头:

看来有问题的文件头前面多了三个字节EF BB BF。

具体原因如下:

        某些编辑器会往utf8文件中添加utf8标记(editplus称其为签名),它会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM),它的表示的是 Unicode 标记(BOM)。 因此要解决这个问题的关键就是把这个标记选项去掉,可按如下方法操作。 
        首先用editplus打开这个文件,从Doucument菜单中选择Permanet Settings,有三个分类,分别是General,File, Tools.点击File,右边会有一项是 UTF-8 signature: 选择 always remove signature. 点击OK 。中文版本的 Editplus 下操作的菜单结构如下: 文档->参数设置->文件->UTF-8签名->总是移除签名->确定 ,这样就设置了UTF-8格式不需要在文件前面加标记,最后把文件另存为utf-8格式就好了.

相关资料,网上摘抄:

         UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:在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, UTF-16, UTF-32 & BOM:http://www.unicode.org/faq/utf_bom.html#BOM

W3C官方说明:http://www.w3.org/International/questions/qa-utf8-bom
--------------------- 
作者:shixing_11 
来源:优快云 
原文:https://blog.youkuaiyun.com/shixing_11/article/details/6976900 
 

针对上边编译错误的问题,解决方法其实很简单,只要把BOM头删掉就好了。Linux下可以这么操作:

vi -b ***.java

然后可以看到文件头有<FEFF>的字样,把它删掉即可。

system "copy "C:\0rjaz\ansys\ANSYSI~1\v221\fluent"\fluent22.1.0\src\udf\sconstruct.udf "libudf\win64\3ddp_node\SConstruct" ") ????? 1 ??????? (system "copy "C:\0rjaz\ansys\ANSYSI~1\v221\fluent"\fluent22.1.0\src\udf\scons_test.bat "libudf\win64\3ddp_node\scons_test.bat" ") ????? 1 ??????? (chdir "libudf")(chdir "win64\3ddp_node")Compiler used is "C:\0rjaz\ansys\ANSYSI~1\v221\fluent"\ntbin\clang\bin\clang-cl Linker used is "C:\0rjaz\ansys\ANSYSI~1\v221\fluent"\ntbin\clang\bin\lld-link Copy("C:\1wjzl\PROCESS\libudf\win64\3ddp_node\resolve.exe", "C:\0rjaz\ansys\ANSYSI~1\v221\fluent\ntbin\win64\resolve.exe") Copy("C:\1wjzl\PROCESS\libudf\win64\3ddp_node\o2mfr3.c", "C:\1wjzl\PROCESS\libudf\src\o2mfr3.c") c_sources ['o2mfr3.c', 'udf_names.c'] c_sources_ ['o2mfr3.c'] In file included from o2mfr3.c:1: In file included from C:\0rjaz\ansys\ANSYSI~1\v221\fluent\fluent22.1.0\src\udf\udf.h:22: In file included from C:\0rjaz\ansys\ANSYSI~1\v221\fluent\fluent22.1.0\src\main\global.h:266: In file included from C:\0rjaz\ansys\ANSYSI~1\v221\fluent\fluent22.1.0\src\storage\var.h:10: C:\0rjaz\ansys\ANSYSI~1\v221\fluent\ntbin\clang\10\Include\10.0.18362.0\shared\basetsd.h(322,12): warning: cast to 'void * __ptr32' from smaller integer type 'unsigned long' [-Wint-to-void-pointer-cast] return((void * POINTER_32) (unsigned long) (ULONG_PTR) p); ^ o2mfr3.c(13,16): warning: illegal character encoding in string literal [-Winvalid-source-encoding] Error("<CE><DE>��<CF>?<CC>ID"); // GBK<B0><B2>?<D7>?<FB><B4><AE> ^~~~~~~~ ~~~~~~~~ o2mfr3.c(22,19): error: initializing 'real *' (aka 'double *') with an expression of incompatible type 'real' (aka 'double'); take the address with & real* vel = F_V(f, thread); ^ ~~~~~~~~~~~~~~ & o2mfr3.c(31,17): warning: illegal character encoding in string literal [-Winvalid-source-encoding] printf("<D1><F5><C6><F8><C1><F7><C1><BF>: %.4e kg/s\n", total_mass); // <B4><BF>ASCII<D7>?<FB> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3 warnings and 1 error generated. scons: *** [o2mfr3.obj] Error 1 Done.
05-30
Output: error:exit status 1 main.java:1: error: illegal character: '#' # 验证安装 ^ main.java:2: error: class, interface, or enum expected xcode-select --install ^ main.java:4: error: illegal character: '\u251c' ├── HelloWorld ^ main.java:4: error: illegal character: '\u2500' ├── HelloWorld ^ main.java:4: error: illegal character: '\u2500' ├── HelloWorld ^ main.java:5: error: illegal character: '\u2502' │ ├── ViewController.swift # 主逻辑代码 ^ main.java:5: error: illegal character: '\u251c' │ ├── ViewController.swift # 主逻辑代码 ^ main.java:5: error: illegal character: '\u2500' │ ├── ViewController.swift # 主逻辑代码 ^ main.java:5: error: illegal character: '\u2500' │ ├── ViewController.swift # 主逻辑代码 ^ main.java:5: error: illegal character: '#' │ ├── ViewController.swift # 主逻辑代码 ^ main.java:6: error: illegal character: '\u2502' │ ├── Main.storyboard # 可视化界面设计 ^ main.java:6: error: illegal character: '\u251c' │ ├── Main.storyboard # 可视化界面设计 ^ main.java:6: error: illegal character: '\u2500' │ ├── Main.storyboard # 可视化界面设计 ^ main.java:6: error: illegal character: '\u2500' │ ├── Main.storyboard # 可视化界面设计 ^ main.java:6: error: illegal character: '#' │ ├── Main.storyboard # 可视化界面设计 ^ main.java:7: error: illegal character: '\u2502' │ └── Assets.xcassets # 图片资源 ^ main.java:7: error: illegal character: '\u2514' │ └── Assets.xcassets # 图片资源 ^ main.java:7: error: illegal character: '\u2500' │ └── Assets.xcassets # 图片资源 ^ main.java:7: error: illegal character: '\u2500' │ └── Assets.xcassets # 图片资源 ^ main.java:7: error: illegal character: '#' │ └── Assets.xcassets # 图片资源 ^ main.java:8: error: illegal character: '\u251c' ├── Products ^ main.java:8: error: illegal character: '\u2500' ├── Products ^ main.java:8: error: illegal character: '\u2500' ├── Products ^ main.java:9: error: illegal character: '\u2514' └── HelloWorldTests # 单元测试 ^ main.java:9: error: illegal character: '\u2500' └── HelloWorldTests # 单元测试 ^ main.java:9: error: illegal character: '\u2500' └── HelloWorldTests # 单元测试 ^ main.java:9: error: illegal character: '#' └── HelloWorldTests # 单元测试 ^ main.java:11: error: '.' expected import UIKit ^ main.java:12: error: ';' expected class ViewController: UIViewController { ^ main.java:12: error: class, interface, or enum expected class ViewController: UIViewController { ^ main.java:12: error: class, interface, or enum expected class ViewController: UIViewController { ^ main.java:14: error: class, interface, or enum expected @IBOutlet weak var myLabel: UILabel! // 关联Storyboard中的Label ^ main.java:27: error: illegal character: '#' button.addTarget(self, action: #selector(buttonClicked), for:... 这是上个代码的运行结果
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值