1. 程式人生 > >Eclipse 中 Syntax error on token "Invalid Character", delete this token 的解決

Eclipse 中 Syntax error on token "Invalid Character", delete this token 的解決

細節 字節序 java _id char 總結 符號 復制 wrap

eclipse中遇到了Syntax error on token "Invalid Character", delete this token(令牌“無效字符”上的語法錯誤,刪除此令牌)的錯誤提示,看代碼是完全沒有問題,上網查了半天發現遇到這個問題的好像不太多,總結一下問題原因和解決方案:

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

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

3、什麽是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。
??我們使用Notepad++,當我們選擇【編碼(N)】時,會出現編碼的選項,如下圖所示:

  技術分享圖片

4、UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。

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

6、問題定位到該怎麽解決呢?解決方法如下:
??1)使用UE或者其他文本工具,將有問題的java文件另存為UTF-8,無BOM編碼的格式,替換原來的java文件。
??2)使用eclipse自建的文件編碼,盡量不要從其他地方拷貝代碼,手寫要復制的代碼。

Eclipse 中 Syntax error on token "Invalid Character", delete this token 的解決