[轉]Syntax error on token "Invalid Character", delete this token 的解決


eclipse 中遇到了Syntax error on token "Invalid Character", delete this token的錯誤提示,看代碼是完全沒有問題,上網查了半天發現遇到這個問題的好像不太多,總結一下問題原因和解決方案吧。

看到這個提示首先想到的是標點符號不是不是中文,或者全角半角的問題了,通過檢查,這種問題並不存在。

然后看到一個帖子說用Android Studio引入eclipse項目時遇到了同樣的錯誤, 原因是eclipse和idea對同樣編碼utf-8的細節不一致,一個有BOM,一個沒有。

什么是BOM呢?BOM的全稱是:Byte order mark。 UTF-8以字節為編碼單元,沒有字節序的問題。UTF-16以兩個字節為編碼單元,在解釋一個UTF-16文本前,首先要弄清 楚每個編碼單元的字節序。例如收到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節流 “594E”,那么這是“奎”還是“乙”? Unicode規范中推薦的標記字節順序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是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編碼了。

通過UE查看文件的16進制形式,發現開頭包含EF BB BF串,eclipse不對其做識別而作為普通的字符處理,因此報錯。

問題定位到該怎么解決呢?

解決方法:

1.使用UE或者其他文本工具,將有問題的java文件另存為UTF-8,無BOM,替換原來的java文件。

2.使用eclipse自建的文件編碼,盡量不要從其他地方拷貝代碼

參考鏈接:

http://en.wikipedia.org/wiki/Byte_order_mark

http://my.eoe.cn/4903/archive/10499.html

http://stackoverflow.com/questions/2223882/whats-different-between-utf-8-and-utf-8-without-bom

http://www.cnblogs.com/DDark/archive/2011/11/28/2266085.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM